继承类中的Ruby和类变量 A类 def设置(v) @@v=v 结束 def put 放置@@v 结束 结束 B类C B.new.put#=>c
为什么??我应该如何写这篇文章,才能在最后一个b.new.put中有“b”?这是一篇关于这个主题的好文章- 基本上,您可以做的是:继承类中的Ruby和类变量 A类 def设置(v) @@v=v 结束 def put 放置@@v 结束 结束 B类C B.new.put#=>c,ruby,class-variables,Ruby,Class Variables,为什么??我应该如何写这篇文章,才能在最后一个b.new.put中有“b”?这是一篇关于这个主题的好文章- 基本上,您可以做的是: class A def set(v) @@v = v end def put puts @@v end end class B < A end class C < A end B.new.set 'b' B.new.put # => b C.new.set 'c' C.new.put # => c B.ne
class A
def set(v)
@@v = v
end
def put
puts @@v
end
end
class B < A
end
class C < A
end
B.new.set 'b'
B.new.put # => b
C.new.set 'c'
C.new.put # => c
B.new.put # => c
在这种情况下,foo
是只为a
对象定义的方法,而不是为a
类的每个实例定义的方法。在object的singleton类中定义方法的另一种方法如下:
a = A.new
def a.foo
puts 'foo'
end
class为类变量(一个@@variable)赋值可以为类的每个实例设置它。它甚至为“尚未创建”的实例“设置”它,因此,考虑这个…
class << a # open a's singleton class
def bar # define method that will be available only on 'a' object
puts 'bar'
end
end
@v怎么能在其中有值呢?第二个对象的值@@v将是未设置的,除了@@v是一个类变量这一事实,因此它对于类的每个实例都具有相同的值。另一个选项是从Rails中退出并将其行为包含在类中。有关良好的讨论和代码的细节,请参阅
不过,也许您并不真正想要类变量。这里真正的问题是Ruby中的类变量实际上是类层次结构变量。该类与所有子类共享其类变量。您确定不只需要实例变量吗?(例如@v,而不是@v)@Ximik没问题。它基本上是KL-7答案的一个可扩展、分层版本;
class << a # open a's singleton class
def bar # define method that will be available only on 'a' object
puts 'bar'
end
end
B.new.set 'b' # OK, that set @@v for that particular instance of B
B.new.put # Hey, you just created *another* new instance of B!