Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 继承但不与超类共享且不共享命名空间的变量/常量_Ruby_Variables_Constants - Fatal编程技术网

Ruby 继承但不与超类共享且不共享命名空间的变量/常量

Ruby 继承但不与超类共享且不共享命名空间的变量/常量,ruby,variables,constants,Ruby,Variables,Constants,有并没有办法引入具有以下三个属性的变量/常量 a) 当超类未在自己的类中赋值时,它继承超类的值 b) 它不会继承超类以外的其他类的值(即使它们共享名称空间) c) 当在自己的类中赋值时,它不会覆盖超类的值 使用类实例变量时,a)不满足要求 class A; @foo = :foo end class B < A; @foo end # => nil (Does not satisfy (a)) class A; class C; @foo end end # => nil (

有并没有办法引入具有以下三个属性的变量/常量

a) 当超类未在自己的类中赋值时,它继承超类的值

b) 它不会继承超类以外的其他类的值(即使它们共享名称空间)

c) 当在自己的类中赋值时,它不会覆盖超类的值

使用类实例变量时,a)不满足要求

class A; @foo = :foo end
class B < A; @foo end # => nil  (Does not satisfy (a))
class A; class C; @foo end end # => nil (Satisfies (b))

class B < A; @foo = :bar end
class A; @foo end # => :foo  (Satisfies (c))
class A; @@foo = :foo end
class B < A; @@foo end # => :foo  (Satisfies (a))
class A; class C; @foo end end # => NameError (Satisfies (b))

class B < A; @@foo = :bar end
class A; @foo end # => :bar  (Does not satisfy (c))
class A; Foo = :foo end
class B < A; Foo end # => :foo  (Satisfies (a))
class A; class C; Foo end end # => :foo (Does not satisfy (b))

class B < A; Foo = :bar end
class A; Foo end # => :foo  (Satisfies (c))
A类@foo=:foo结束
B级nil(不满足(a))
甲级;丙级;@foo end#=>nil(满足(b))
B级:foo(满足(c))
使用类变量,c)是不满足的

class A; @foo = :foo end
class B < A; @foo end # => nil  (Does not satisfy (a))
class A; class C; @foo end end # => nil (Satisfies (b))

class B < A; @foo = :bar end
class A; @foo end # => :foo  (Satisfies (c))
class A; @@foo = :foo end
class B < A; @@foo end # => :foo  (Satisfies (a))
class A; class C; @foo end end # => NameError (Satisfies (b))

class B < A; @@foo = :bar end
class A; @foo end # => :bar  (Does not satisfy (c))
class A; Foo = :foo end
class B < A; Foo end # => :foo  (Satisfies (a))
class A; class C; Foo end end # => :foo (Does not satisfy (b))

class B < A; Foo = :bar end
class A; Foo end # => :foo  (Satisfies (c))
A类@@foo=:foo结束
B级:foo(满足(a))
甲级;丙级;@foo end#=>名称错误(满足(b))
B级:条(不满足(c))
使用常数b)不满足要求

class A; @foo = :foo end
class B < A; @foo end # => nil  (Does not satisfy (a))
class A; class C; @foo end end # => nil (Satisfies (b))

class B < A; @foo = :bar end
class A; @foo end # => :foo  (Satisfies (c))
class A; @@foo = :foo end
class B < A; @@foo end # => :foo  (Satisfies (a))
class A; class C; @foo end end # => NameError (Satisfies (b))

class B < A; @@foo = :bar end
class A; @foo end # => :bar  (Does not satisfy (c))
class A; Foo = :foo end
class B < A; Foo end # => :foo  (Satisfies (a))
class A; class C; Foo end end # => :foo (Does not satisfy (b))

class B < A; Foo = :bar end
class A; Foo end # => :foo  (Satisfies (c))
A类;Foo=:Foo结束
B级:Foo(满足(a))
甲级;丙级;;Foo end#=>:Foo(不满足(b))
B级:Foo(满足(c))
我想要这样的东西:

class A; something = :foo end
class B < A; something end # => :foo  (Satisfies (a))
class A; class C; something end end # => nil or Error (Satisfies (b))

class B < A; something = :bar end
class A; something end # => :foo  (Satisfies (c))
A类;something=:foo end
B级零或错误(满足(b))
B级

如果不能简单地通过赋值和引用变量/常量来实现,那么有没有办法实现具有此属性的访问器方法?

您需要创建自己类型的具有所需特定属性的访问器。比如说,

module InheritableProperty
  def property
    @property || superclass.property
  end
  def property=(value)
    @property = value
  end
end

class A
  extend InheritableProperty
end
class B < A
  extend InheritableProperty
  class C
    extend InheritableProperty
  end
end

A.property = 1
A.property # => 1
B.property # => 1
B::C.property # error

A.property = 1
B.property = 2
A.property # => 1
B.property # => 2
B::C.property # error

A.property = 1
B.property = 2
B::C.property = 3
A.property # => 1
B.property # => 2
B::C.property # => 3
模块可继承属性
def属性
@属性| |超类.property
结束
def属性=(值)
@属性=值
结束
结束
甲级
扩展可继承属性
结束
B类1
B.属性#=>1
B::C.属性#错误
A.property=1
B.属性=2
A.属性#=>1
B.属性#=>2
B::C.属性#错误
A.property=1
B.属性=2
B::C.property=3
A.属性#=>1
B.属性#=>2
B::C.属性#=>3

按照约书亚·那不勒斯的建议,我决定这样做:

class A
  def self.foo; defined?(@foo) ? @foo : superclass.foo end
end

class A; @foo = :foo end
class B < A; foo end # => :foo
class A; class C; foo end end # => Error
class B < A; @foo = :bar end
class A; foo end # => :foo
A类
def self.foo;定义?(@foo)@foo:superclass.foo结束
结束
甲级@foo=:foo结束
B级:foo
甲级;丙级;;foo end#=>错误
B级:foo