2016-09-06 260 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