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

时间:2014-01-17 08:03:40

标签: ruby local-variables

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

以下是代码:

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

现在a的值是“你好”:

>> a
=> "hello"

奇怪的是b的价值是零

>> b
=> nil

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

为什么?

3 个答案:

答案 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