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 || 1
或 false || 1
将 return 1.
||是逻辑运算符,而不是按位运算符。与 C 等其他语言不同,0 不是 ruby.
中的 "falsey" 值
因为||是一个短路逻辑运算符,你有以下等效语句:
定义值“0”||定义值“1”
哪个 ruby 被正确评估为 真实表达式 A || 真实表达式 B 并返回 真实表达式 A 即 0.
看这里:https://gist.github.com/jfarmer/2647362
"Truthy" 和 "Falsey" 值在 Python 和 Ruby 中的良好概述。
这里发生了两件事:
- 与其他语言不同,在 Ruby 中,
0
是真值(这意味着它在布尔上下文中被评估为真)。
- 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
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 || 1
或 false || 1
将 return 1.
||是逻辑运算符,而不是按位运算符。与 C 等其他语言不同,0 不是 ruby.
中的 "falsey" 值因为||是一个短路逻辑运算符,你有以下等效语句:
定义值“0”||定义值“1”
哪个 ruby 被正确评估为 真实表达式 A || 真实表达式 B 并返回 真实表达式 A 即 0.
看这里:https://gist.github.com/jfarmer/2647362
"Truthy" 和 "Falsey" 值在 Python 和 Ruby 中的良好概述。
这里发生了两件事:
- 与其他语言不同,在 Ruby 中,
0
是真值(这意味着它在布尔上下文中被评估为真)。 - 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