我偶然发现了 ruby 中关于变量定义的一个奇怪行为(并且在途中丢失了一盒甜甜圈):
irb(main):001:0> if false
irb(main):002:1> a = 1
irb(main):003:1> end
=> nil
irb(main):005:0> a.nil?
=> true
irb(main):006:0> b.nil?
NameError: undefined local variable or method `b' for main:Object
from (irb):6
from /Users/jlh/.rbenv/versions/2.1.5/bin/irb:11:in `<main>'
为什么不a.nil?
扔undefined local variable
?例如,看一下 python(只是想将其与解释语言进行比较):
>>> if False:
... a = 1
...
>>> print a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
在编译语言中,这甚至无法编译。
- 这是否意味着 ruby 会保留对该变量的引用,即使它没有通过那段代码?
- 如果是这样,变量定义考虑的 ifs/else 有多深?
我真的不敢相信这是 ruby 的预期行为。而且它不是特定于 irb 的,在 ruby/rails 代码块中运行它会得到相同的结果。