ruby为什么0 || 1是0

时间:2016-09-06 10:30:26

标签: ruby boolean bitwise-operators

AND运算符在第一个为真时返回第二个值,第一个在它为假的时候返回

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

为什么OR操作在第一个值为false时不返回第二个值,但在第一个值为true时返回第二个值

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

4 个答案:

答案 0 :(得分:3)

只要他们知道他们给你的表达式的值,就会对OR和AND进行短路评估。 在Ruby中,0和1都是正确的,它们是真正的值。所以

0 || 1 is 0

因为0是真的。 只需nil || 1false || 1即可返回1.

答案 1 :(得分:1)

||是一个逻辑运算符,而不是一个按位运算符。与例如C的其他语言不同,0不是" falsey"红宝石的价值。

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

定义的值" 0" ||定义的值" 1"

哪个ruby正确地评估为 truthy表达式A || truthy表达式B 并返回 truthy表达式A 即0。

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

了解" Truthy"和" Falsey" Python和Ruby中的值。

答案 2 :(得分:1)

Ruby只在这样的表达式中评估它所需的数量,然后停止,你看到的返回只是它评估的表达式的最后一部分。 所以对你的&& case,它总是必须运行到最后,以防后一个子句返回false,这将导致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 

答案 3 :(得分:0)

这里有两件事:

  1. 与其他语言不同,在Ruby中,0是真实的(这意味着它在布尔上下文中被评估为真)。
  2. Ruby中的OR运算符(||)快捷方式,如果它是真的,则返回左参数。
  3. 将这两者放在一起,您就可以0 || 1返回0