ruby 为什么 0 || 1 是 0

ruby why 0 || 1 is 0

AND 运算符 return 第一个为真时的第二个值,为假时的第一个值

1 && 2 ---> 2
0 && 1 ---> 0

为什么 OR 操作不是 return 第二个值,当第一个为假时,但 return 第一个为真时

0 || 1 ---> 0
1 || 0 ---> 1

OR 和 AND 都是短路计算的,一旦他们知道表达式的值,他们就会将其提供给您。 在 Ruby 中,0 和 1 都为真,它们是真值。所以

0 || 1 is 0

因为 0 为真。 nil || 1false || 1 将 return 1.

||是逻辑运算符,而不是按位运算符。与 C 等其他语言不同,0 不是 ruby.

中的 "falsey" 值

因为||是一个短路逻辑运算符,你有以下等效语句:

定义值“0”||定义值“1”

哪个 ruby 被正确评估为 真实表达式 A || 真实表达式 B 并返回 真实表达式 A 即 0.

看这里:https://gist.github.com/jfarmer/2647362

"Truthy" 和 "Falsey" 值在 Python 和 Ruby 中的良好概述。

这里发生了两件事:

  1. 与其他语言不同,在 Ruby 中,0 是真值(这意味着它在布尔上下文中被评估为真)。
  2. Ruby (||) 快捷方式中的 OR 运算符和 returns 左参数(如果为真)。

把这两个放在一起,你就得到了 0 || 1 returns 0

Ruby 仅在这样的表达式中计算所需的数量,然后停止,您看到的返回只是它计算的表达式的最后一部分。 因此,对于您的 && 情况,它始终必须 运行 一直到最后,以防后面的子句 returns 为假,这会导致 AND 为假。

实际上你的例子是错误的:

irb> 0 && 1
=> 1

这是预期的,因为 0 在 Ruby 中是真值,而不是像 C 中那样假。

对于 OR 的情况,它可以在遇到任何真实的东西时立即停止,不需要理会其余的。

0 || false      # => 0
false || 0      # => 0
false || 0 || 2 # => 0

如果您想将这样的表达式强制转换为布尔值,这就是您经常看到的做法:

!!(expression)
!!(0 || 1)        => true
!!(nil || false)  => false