关于方法中变量引用的简单Ruby谜题

时间:2012-10-04 19:14:24

标签: ruby

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

def foo
  foo ||= 1
end

foo # => 1

改写以下方式它会死:

def foo
  foo.nil? ? 1 : foo
end

1 个答案:

答案 0 :(得分:4)

在第一种情况下,foo ||= 1指的是局部变量。当您在裸字上进行赋值时,Ruby总是创建一个局部变量,这就是为什么如果要调用定义为self.foo = ...的编写器方法,则必须编写def foo=(value)。毕竟,||=运算符只是一个奇特的赋值运算符。

在第二种情况下,没有赋值,因此当它命中foo.nil?时,Ruby将裸字foo解释为方法调用,然后爆炸。