其他条件中的变量假定为零值

这是我在ruby 1.9.3中想到的奇怪之处。

这是代码:

>> r = true >> if r >> a = "hello" >> else >> b = "hello" >> end 

现在a的值是“你好”:

 >> a => "hello" 

奇怪的是, b的值是零

 >> b => nil 

由于b在场景中无处可去,因此应该是未声明的。

为什么?

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

 => foo # NameError: undefined local variable or method `foo' for main:Object => if false => foo = "bar" # does not assign to foo => end => nil => foo => nil 

即使从未到达进行赋值的分支,变量声明也会生效。

其原因在Ruby文档中有解释,它适用于任何版本的Ruby,而不仅仅是1.9:

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

这意味着如果解析器在代码中看到一个赋值,它就会创建局部变量,即使赋值永远不会真正发生。 在这种情况下,变量引用的值为nil

 if true a = 0 else b = 0 end p local_variables # => [:a, :b] pa # => 0 pb # => nil