2017-03-24 93 views
1

我對this有一般認識。它是運營商的優先級圖表。移位運算符優先於邏輯運算符(& & ||)。我有這樣的情況,其中arr是一個數組,黨是nil移位運算符的紅寶石運算符優先級問題

arr << party && party[3] 

現在開始我做這個,我想如果當事人是不是黨[]零永遠不會被調用時。當然,由於< <具有更高的優先級嘗試這首:

arr << party 

但接下來會發生什麼?請問紅寶石那麼這樣做:

arr << party[3] 

請注意,我用的最高經營者()來解決問題:

arr << (party && party[3]) 
+1

作爲一般的做法是很好用括號來強制改變優先級時,你想到一個解釋器或編譯器將無法理解你的表達。一種語言(如Ruby)可能會使它們成爲可選項,但不使用它們會導致奇怪/意外的行爲。 –

回答

3

<<運營商對數組返回數組。因此,如果party爲零,則nil被推到arr,然後party[3]被評估爲布爾表達式的一部分(因爲表達式的左部分是真實的並且沒有短路)。由於party爲零,這裏會出現錯誤。

實際上,<<運算符被解析爲<< Array類的方法。這與push非常相似。但是,作爲一個運營商,它具有不同的優先級,是的。如果你要使用一種方法,它會更像你所期望的。

arr.push party && party[3] # => [nil] 
arr.<< party && party[3] # => [nil] 

我,我把括號內隨處可見,其中有疑問的連個影子。

arr.push(party && party[3]) 

此外,不確定意圖,但可能在您的代碼中有一個小錯誤。上面的行總是會推arrfalse,nilparty[3]之一。如果你想不與falsy值做任何事情,那麼這是更好地做這樣的事情

arr << party[3] if party 
+2

很好的答案。就我個人而言,我認爲鏟運算符更直觀,在這裏使用它可以很好地使用替代語法:'arr << party [3] if party'。 – moveson

+2

「我把括號放在任何地方,甚至有一絲懷疑。」同上。他們不花費任何東西,並且可以節省很多頭部衝擊。 –