Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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和类变量 A类 def设置(v) @@v=v 结束 def put 放置@@v 结束 结束 B类C B.new.put#=>c_Ruby_Class Variables - Fatal编程技术网

继承类中的Ruby和类变量 A类 def设置(v) @@v=v 结束 def put 放置@@v 结束 结束 B类C B.new.put#=>c

继承类中的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

为什么??我应该如何写这篇文章,才能在最后一个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.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!