类变量的工作原理如下:
class Hello
@@x = 0
def self.counter
@@x
end
def initialize
@@x += 1
end
end
Hello.new
Hello.new
Hello.new
p Hello.counter
#=> 3
但是类实例变量不是:
class Goodbye
@x = 0
def self.counter
@x
end
def initialize
@x += 1
end
end
Goodbye.new
Goodbye.new
Goodbye.new
Goodbye.new
p Goodbye.counter
#=> Error
我做错了什么?我的印象是类实例变量与类变量相同,只是没有继承问题......但是你如何使用它们(例如,计算特定类的实例,就像我在这里发布的代码一样)?
答案 0 :(得分:1)
实例变量属于对象(实例),这就是它们被调用的原因。在第2行和第5行中,@x
属于对象Goodbye
,但在第9行中,@x
属于Goodbye
的实例。你永远不会初始化这个实例变量,未初始化的实例变量评估为nil
,nil
没有+
方法,你会得到一个{ {1}}。
请注意,NoMethodError
不会像您声明的那样引发错误,只会返回Goodbye.counter
。 0
内会引发错误。
这是一个微不足道的修复:
initialize