2014-04-25 56 views
0

我是打在撬碰到這樣的:奇怪的紅玉邏輯&&操作結果

20] pry(main)> ('X' && 'O') == 'X' 
=> false 
[22] pry(main)> ('O' && 'X') == 'X' 
=> true 

有了這個,我試圖檢查括號內的兩個值是相同的右邊的值。 雖然第二個的結果告訴我我錯過了一些東西。

它似乎是返回最後一次比較的值('X'=='X'),但我的印象是& &只要發現第一個錯誤就會停止?

我可以看到爲什麼訂單在一般情況下很重要,但我認爲通過將它們包裝在()中它們會被檢查爲一個條件?

回答

5

但我的印象是,& &會停止,只要它發現第一個假?

你是對的。但是,這兩個例子都沒有發生。

在你的例子'O''X'中,都是字符串對象,其中有truthy的值。

在該示例('X' && 'O') == 'X'('X' && 'O')給出"O",並且它是被比較"X",這是道false。因此你得到了false

在其它一個('O' && 'X') == 'X'('O' && 'X')給出"X",並然後將其進行比較,以"X",和 - 當然,應當true。因此,您在PRY中獲得了true

注意:在Ruby中,所有對象都有truthy值,但nilfalse除外。

在使用&&時,它將繼續評估其所有表達,直至得到一個表達式,其評估結果爲falsy

+1

謝謝奧雅納。我意識到真理和謬誤的價值觀,我剛把這些操作搞混了:) – Maikon

1

紅寶石&&and它會首先檢查值,如果它的存在,it.ll去下一個值,第一個值falsenil它將返回值。

foo = :foo 
bar = nil 

a = foo and bar 
# => nil 
a 
# => :foo 

a = foo && bar 
# => nil 
a 
# => nil 

a = (foo and bar) 
# => nil 
a 
# => nil 

(a = foo) && bar 
# => nil 
a 
# => :foo 
> a = true && false 
=> false 
> a 
=> false 
> a = true and false 
=> false 
> a 
=> true