10

以下代码导致我出现问题:

class Foo
  def initialize(n=0)
    @n = n
  end

  attr_accessor :n

  def inc
    n+=1
  end
end

跟注Foo.new.inc加注NoMethodError: undefined method '+' for nil:NilClass 跟注Foo.new.n返回0

为什么会Foo.new.inc引发错误?我可以做Foo.new.n+=1没有问题。

4

2 回答 2

16

tldr; self.n = x必须始终使用某种形式分配给setter

考虑一下它n += x扩展到n = n + xn作为局部变量绑定的位置,因为它出现在赋值的左侧。局部变量的这种“引入”抵消了对 self的隐式方法调用(例如n-> )的正常回退行为。self.n

因此,由于n尚未分配(但它现在被绑定为局部变量),因此表达式评估为 n = nil + x导致引发异常的原因。

于 2013-10-24T04:47:05.823 回答
4

用这个

def inc
  self.n += 1
end

或这个

def inc
  @n += 1
end

在您的情况下,裸名称“n”被解释为局部变量(不存在)。您需要明确指定它是一个方法 ( self.n) 或使用底层实例变量。

于 2013-10-24T04:41:41.433 回答