1

类变量的工作方式如下:

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

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

4

1 回答 1

1

实例变量属于对象(实例),这就是它们被称为的原因。在第 2 行和第 5 行,@x属于对象Goodbye,但在第 9 行,@x属于 的一个实例Goodbye。您永远不会初始化实例变量,并且未初始化的实例变量评估为nilnil没有+方法,因此您会得到NoMethodError.

请注意,Goodbye.counter不会像您声称的那样引发错误,它只是返回0. 内部引发错误initialize

这是微不足道的修复:

class Goodbye
  @x = 0

  def self.counter
   @x
  end

  def self.new
    @x += 1
    super
  end  
end

Goodbye.new
Goodbye.new
Goodbye.new
Goodbye.new
p Goodbye.counter
#=> 4
于 2014-09-28T11:19:58.270 回答