2013-04-16 45 views
0

我已經看到了這句法在Ruby中:Ruby或||語法與對象

x = ary['value'] || Value.new 

我得到這個角色,如果離開的側||是錯誤的,那麼右側將被執行。但我不明白的一部分:

false || (object) becomes (object) 

我想||應該解析爲布爾值。至少在大多數其他語言中。爲什麼Ruby解析爲一個對象。

另一個類似的問題,我也有:

'test' || true 
=> "test" 

如何「測試」得到評估爲真?

回答

1

在Ruby中,有四種情況:

假的就是假

真實不虛

無是假-y

還有什麼是真理-Y

所以,

5 && 8 #=> 8 
5 || false #=> 5 
false || 5 #=> 5 
(5 && 8) == true #=> false 
!!(5 && 8) == true #=> true 
!!(false || nil) == false #=> true 
1

拇指布爾評價 Ruby中重要原則是,只有對象NilClassFalseClass作爲虛假評估。任何其他對象,包括String,都被評估爲true,即使它是空的。

1

在Ruby中,和大多數編程語言一樣,一些值是truthy,而另一些值是錯誤的。出於布爾評估目的,truthy值爲true,同樣虛假值爲false

然而,truthy值實際上沒有投射到true和falsey並不投射到false,它可以讓布爾表達式評估爲一些有益的,而不是平的truefalse

nilfalse是Ruby中唯一錯誤的值。請注意0​​是truthy,與大多數其他語言不同。

有關更多詳細信息,請參見https://gist.github.com/jfarmer/2647362

1

這叫做short-circuiting

通過與操作者||接合在一起其他表達式將是短路,這意味着它形成的任何表述「停止」在第一truthy表達。

所以考慮這個例子:

nil || Value.new 

Ruby解釋着眼於nil第一;那麼,既然這不是真理,它就會轉向下一個表達式。

現在考慮你的問題的最後例子:

"test" || true 

紅寶石看"test"第一;因爲這是真理,評估在那裏停止。

&&運營商也是如此,它基本上是相同的短路邏輯,但只有當它發現一個僞造的表達式時才停止。

藉此例如:

person && person.name 

如果personnil,則上述表達式會nil,因爲這是第一falsey表達。

在另一方面:

person && person.male? && person.name 

假設person不是零,而是女性。然後(假設male?返回false)上述表達式將評估爲false

當然,如果沒有表達式是錯誤的,那麼&&運算符只是給你最後一個(這通常是你想要的)。