7

可能重复:
为什么 a = a 在 Ruby 中为零?

容我们说,在使用未定义变量的 Ruby 中有一个“奇怪的现象” 。就像这样:

# irb session follows
#
foo        # undefined local variable or method 'foo'
bar        # same for 'bar'
foo = bar  # still same for 'bar'
foo = foo  # nil - HUH?
foo        # is now set to nil!?

为什么我可以在 Ruby 中为自身分配一个未定义的变量并获取nil

请注意,我在这里使用的是 Ruby 1.9.3。我不确定这在哪些其他版本中可能是正确的。

(感谢 Gary Bernhardt 在他搞笑的演讲中证明了这一点。)

4

2 回答 2

9

bar 未定义的事实实际上并不是最有趣的部分,因为甚至不需要尝试赋值,例如

if false
  foo = 1
end

将 foo 设置为 nil。据我了解,局部变量范围是静态确定的,因为它是在没有实际运行代码的情况下确定的,只是通过分析它。Ruby 认为赋值可能会发生,因此它创建了局部变量并将其设置为 nil。见http://ruby.runpaint.org/variables#local

于 2012-02-02T22:18:42.453 回答
2

Nil 在 Ruby 中很神奇,因为一切都是对象。实际上有一个被分配的单例 nil 对象。当你做了

foo = bar

“foo”变量突然出现,并将魔法 nil 对象作为值。在你进行赋值之前,Ruby 没有办法“知道” foo 是什么(它是一个变量吗?一个方法调用?),但是一旦你完成了赋值,它就开始将它视为一个变量。

于 2012-02-02T22:07:29.183 回答