这是我在ruby 1.9.3中想到的奇怪之处。
以下是代码:
>> r = true
>> if r
>> a = "hello"
>> else
>> b = "hello"
>> end
现在a
的值是“你好”:
>> a
=> "hello"
奇怪的是b
的价值是零
>> b
=> nil
由于b
在场景中无处可去,因此应该是未声明的。
为什么?
答案 0 :(得分:3)
即使从未到达分配的分支,变量声明也会生效。
答案 1 :(得分:3)
这个原因在Ruby documentation中解释,它适用于任何版本的Ruby,而不仅仅是1.9:
解析器遇到局部变量时会创建局部变量 分配,不是在分配发生时。
这意味着如果解析器在代码中看到一个赋值,它就会创建局部变量,即使赋值永远不会真正发生。在这种情况下,变量引用的值为nil
:
if true
a = 0
else
b = 0
end
p local_variables
# => [:a, :b]
p a
# => 0
p b
# => nil
答案 2 :(得分:2)
解析器遇到局部变量时会创建局部变量 分配,而不是在分配发生时:
=> foo
# NameError: undefined local variable or method `foo' for main:Object
=> if false
=> foo = "bar" # does not assign to foo
=> end
=> nil
=> foo
=> nil