1

为什么这个方法返回 1 而不是死于无限递归?

def foo
  foo ||= 1
end

foo # => 1

重写了以下方式它确实死了:

def foo
  foo.nil? ? 1 : foo
end
4

1 回答 1

4

在第一种情况下,foo ||= 1指的是局部变量。当您对裸字进行赋值时,Ruby 总是会创建一个局部变量,这就是为什么self.foo = ...如果您想调用定义为def foo=(value). ||=毕竟,运算符只是一个花哨的赋值运算符。

在第二种情况下,没有赋值,所以当它命中时foo.nil?,Ruby 将裸词解释foo为方法调用,然后就崩溃了。

于 2012-10-04T19:15:25.673 回答