我一直在玩Ruby并遇到过这种奇怪的行为。有人可以告诉我为什么会这样吗?
如果我跑:
def my_fn
if false then
a = {:a=>10, :b=>20}
end
puts a.class
a || {}
end
并打印代码成功编译的结果并返回{}。 但是,如果我将代码更改为:
def my_fn
puts a.class
a || {}
end
它不会返回{}但会抛出错误。 "'my_fn': undefined local variable or method 'a' for main:Object (NameError)"
不应该只是零而不会导致错误吗?
答案 0 :(得分:9)
在第一个代码解析器中看到行a = {:a=>10, :b=>20}
,因此创建了一个变量,但没有发生任何赋值。因此a
是nil
。 As per the all known facts a || {}
返回{}
。
在第二个代码中,解析器没有看到a
发生任何分配,因此a
尚未创建为局部变量,也未创建名为a
的方法。因此,当您尝试使用a
时,会在报告时收到有效错误,即未定义的局部变量或方法'a'。