gpt4 book ai didi

ruby - 为什么在 Ruby 中,一个 ||当 `a` 未定义时,1 将抛出错误,但 a = a || 1不会?

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:40 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com