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

标签 ruby exception undefined undefined-behavior

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/

相关文章:

node.js - id 未定义(sails.socket.emit)

ruby - 我得到 "undefined method ljust";这个 Ruby 程序有什么问题?

ruby - 从 AWS S3 下载文件时的文件编码问题

ruby - ruby 中的当前时间计算

java - java异常会终止整个java应用程序吗?

javascript - 通过窗口对象引用全局变量时未定义的全局变量

ruby - 使用 Rspec codeschool 3 级挑战 5 进行测试

Android 4.0 与 Canvas.clipPath 的兼容性问题

c# - 如何捕获第三方库中未等待的任务抛出的异常?

javascript - 为什么成员未定义?