当 a
未定义时,则 a || 1
会抛出错误,但是 a = a || 1
不会。这不是有点不一致吗?
irb(main):001:0> a
NameError: undefined local variable or method 'a' for main:Object
from (irb):1
from c:/ruby/bin/irb:12:in '<main>'
irb(main):002:0> a || 1
NameError: undefined local variable or method 'a' for main:Object
from (irb):2
from c:/ruby/bin/irb:12:in '<main>'
irb(main):003:0> a = a || 1
=> 1
最佳答案
a
在这里,您正在评估未定义的 a
。因此,您会得到一个异常(exception)。
a || 1
在这里,您仍然必须评估a
以确定 bool 表达式的值。就像上面一样,a
没有定义。因此,您会得到一个异常(exception)。
a = a || 1
在这里,定义了a
。它被定义为一个未初始化的局部变量。在 Ruby 中,未初始化的变量的计算结果为 nil
,因此赋值表达式右侧的计算结果为 nil || 1
的计算结果为 1
,因此赋值表达式的返回值为 1
副作用是 a
被初始化到 1
。
编辑:在 Ruby 中,变量何时定义以及何时初始化似乎存在一些混淆。 get 在解析时 定义,但在运行时 初始化。你可以在这里看到它:
foo # => NameError: undefined local variable or method `foo' for main:Object
foo
未定义。
if false
foo = 'This will never get executed'
end
此时,foo
已定义,即使该行永远不会执行。该行从未被执行这一事实完全无关紧要,因为无论如何解释器都与此无关:局部变量由解析器定义,解析器显然会看到这一行。
foo # => nil
没有错误,因为 foo
已定义,并且它的计算结果为 nil
因为它未初始化。
关于ruby - 为什么在 Ruby 中,一个 ||当 `a` 未定义时,1 将抛出错误,但 a = a || 1不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983379/