2014-10-20 89 views
-2

我正在瀏覽一些用於驗證的代碼。我無法理解使用&&在下面的語句:&&紅寶石運算符

user = user_token && User.find_by_authentication_token(user_token.to_s) 

我試着用導軌控制檯和IRB。他們都返回了第二個值。任何人都可以解釋爲什麼它被使用?

+0

確保'user_token'不是零 – apneadiving 2014-10-20 10:08:17

+0

是的,但不應該'&&&運算符返回true或false? 我對ruby和rails非常陌生,所以我可能會錯過一些基礎知識。 – level0 2014-10-20 10:10:36

回答

2

你說得對,&&是一個邏輯運算符,但並不意味着它會返回true或false。這裏的主要特點是,如果左表達式評估爲falsy值,則不執行右手操作。你可以這樣想:它不被評估,因爲它不需要知道&&表達式的邏輯值 - 如果左邊的表達式是虛假的,falsy && anything是虛假的,所以不需要評估右邊的表達式。

由於紅寶石每個表達式返回最後執行的子表達式的值(不是真正的東西,但會幫助你理解這個概念),expr1 && expr2如果它falsy將返回expr1值(expr2不計算)或值爲expr2如果expr1是真的。當然,您可以使用&&||鏈表達式。

如果是||,則邏輯相同 - 如果LH表達式值足以確定整個表達式的錯誤,則不要評估RH表達式。在||情況下,如果右手錶達truthy,整個表達式是truthy無論RH的,所以它通常用來設置默認值:

variable = options[:key] || 'Default if options[:key] is false or nil' 
+0

哇!真棒解釋:) ..你剛剛清除我所有的疑慮...想投票這一個..但沒有足夠的聲譽 – level0 2014-10-20 11:12:53

+1

阿迪爾,你可以有我的upvote。 – 2014-10-20 19:52:17

0

這可以被改寫爲

if user_token.nil? 
    user = nil 
else 
    user = User.find_by_authentication_token(user_token.to_s) 
end 

因此在代碼中,我們只是確保user_token設置,是不是nil

+1

明白了..非常感謝:),..看起來我需要再次做基礎知識: – level0 2014-10-20 10:15:08