2014-09-11 42 views
0

我发现很难理解如何将以下变量设置为nil,而它似乎并未分配到任何位置。为什么变量在“if false”中出现时声明?

我试过这个在ruby 2.1.2ruby 1.8.7。两者都产生相同的结果。

这是怎么发生的?

irb(main):002:0> foo 
    NameError: undefined local variable or method `foo' for main:Object 

irb(main):003:0> if false 
    irb(main):004:1> foo = 1 
irb(main):005:1> end 

irb(main):006:0> foo 
=> nil 
+0

(该变量*不*“分配”的值,但它是作为局部变量引入的 - nil仅仅是默认值,因为变量必须计算为* a *值。) – user2864740 2014-09-11 09:13:08

回答

0

Ruby在解析器级别处理分配。从documentation

当分析器遇到的 分配创建的本地变量,当分配发生不:

a = 0 if false # does not assign to a 

p local_variables # prints [:a] 

p a # prints nil 
+1

“解析器遇到赋值”有点含糊;考虑'def x(t);如果t返回y; y =“你好世界”;结束; x(真)'抛出一个NameError。然而解析器在“x”被调用之前“遇到”了整个方法体。 – user2864740 2014-09-11 09:20:09

相关问题