2016-09-06 130 views
1

AND运算符返回第二个值时,第一个是真实的,第一个当它是假红宝石为什么0 || 1是0

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

为什么还是操作不返回第二个值时,第一个是假的,但返回第一个时,它的true

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

'0 && 1'回报'1',不'0' – Stefan

回答

0

红宝石只计算,因为它需要在这样一个表达尽可能多的,然后停止,你看到返回的是刚刚过去的部分它评估的表达。 因此,对于你的& &的情况,它总是必须运行到最后,以防止后面的子句返回false并导致AND为假。

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

irb> 0 && 1 
=> 1 

因为0其中,预计是在Ruby中truthy,还不如假像C.

对于OR情况下,能够尽快停止它会触及任何有趣的事物,并且不需要打扰其他事物。

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

如果要强制这样的表达式为布尔你这是怎么经常看到它做:

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

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

0 || 1 is 0

因为0是真实的。 只是nil || 1false || 1将返回1.

+0

了它,非常感谢 – KhiemNS

+0

不客气:) – Ursus

1

||是一个逻辑运算符,不是一个按位运算符。与例如C的其他语言不同,在ruby中,0不是“虚假”的值。

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

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

哪红宝石被正确地评价为truthy表达式A || truthy表达乙和返回truthy表达式A即0

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

为 “Truthy”,并在Python和Ruby “Falsey” 值的很好的概述。

0

有两件事情在这里发生了:

  1. 不像在其他语言,在Ruby中,0是truthy(这意味着它是评估在布尔上下文是真的)。
  2. Ruby中的OR运算符(||)快捷方式,如果它是truthy,则返回左边的参数。

把这两个在一起,你会得到0 || 1返回0