为什么这个方法返回1而不是从无限递归中死掉?
def foo
foo ||= 1
end
foo # => 1
改写以下方式它会死:
def foo
foo.nil? ? 1 : foo
end
答案 0 :(得分:4)
在第一种情况下,foo ||= 1
指的是局部变量。当您在裸字上进行赋值时,Ruby总是创建一个局部变量,这就是为什么如果要调用定义为self.foo = ...
的编写器方法,则必须编写def foo=(value)
。毕竟,||=
运算符只是一个奇特的赋值运算符。
在第二种情况下,没有赋值,因此当它命中foo.nil?
时,Ruby将裸字foo
解释为方法调用,然后爆炸。