类实例变量正确用法

时间:2014-09-28 09:49:04

标签: ruby class-instance-variables

类变量的工作原理如下:

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

我做错了什么?我的印象是类实例变量与类变量相同,只是没有继承问题......但是你如何使用它们(例如,计算特定类的实例,就像我在这里发布的代码一样)?

1 个答案:

答案 0 :(得分:1)

实例变量属于对象(实例),这就是它们被调用的原因。在第2行和第5行中,@x属于对象Goodbye,但在第9行中,@x属于Goodbye的实例。你永远不会初始化这个实例变量,未初始化的实例变量评估为nilnil没有+方法,你会得到一个{ {1}}。

请注意,NoMethodError 会像您声明的那样引发错误,只会返回Goodbye.counter0内会引发错误。

这是一个微不足道的修复:

initialize