其他条件中的变量假定为零值
这是我在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