为什么变量在“if false”出现时被声明?

我发现很难理解后面的变量是如何被设置为nil ,而它似乎没有被分配到任何地方。

我在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 

Ruby在解析器级别处理分配。 从文档 :

解析器遇到赋值时会创建局部变量,而不是在赋值发生时创建:

 a = 0 if false # does not assign to a p local_variables # prints [:a] pa # prints nil