以下代码导致我出现问题:
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
。
答案 0 :(得分:12)
tldr;某种形式的self.n = x
必须始终用于分配 setter 。
考虑n += x
扩展为n = n + x
,其中 n被绑定为局部变量,因为它出现在作业的左侧。局部变量的这种“引入”抵消了自我隐式方法调用(例如n
- > self.n
)的正常后退行为。
因此,由于尚未分配n
(但现在绑定作为局部变量),表达式的计算结果为 {{1}这就是引发异常的原因。
答案 1 :(得分:4)
使用此
def inc
self.n += 1
end
或者
def inc
@n += 1
end
在您的情况下,裸名“n”被解释为局部变量(不存在)。您需要明确指定它是方法(self.n
)或使用基础实例变量。