從Groovy的角度來看,如果Elvis運算符(?:
)的計算結果爲true
,則返回左表達式的值,否則返回右表達式的值。但是,如果代碼是什麼情況是這樣的:Groovy Elvis,這在Elvis中如何工作?
年齡< => other.age:lastName的< => other.lastName:?的firstName < => other.firstName
如何它執行上面的代碼?
感謝您的回覆。
從Groovy的角度來看,如果Elvis運算符(?:
)的計算結果爲true
,則返回左表達式的值,否則返回右表達式的值。但是,如果代碼是什麼情況是這樣的:Groovy Elvis,這在Elvis中如何工作?
年齡< => other.age:lastName的< => other.lastName:?的firstName < => other.firstName
如何它執行上面的代碼?
感謝您的回覆。
從http://docs.codehaus.org/display/GROOVY/JN2535-Control,<=>
比?:
更高的優先級。這意味着...
age <=> other.age ?: lastName <=> other.lastName ?: firstName <=> other.firstName
變得像...
0 ?: -1 ?: 0
爲-1,結束了。由於0 ?: -1 == -1
和-1 ?: 0 == -1
。
希望是有道理的。看起來這個例子是用來對年齡進行排序的,然後是姓氏,然後是名字。
它首先按年齡比較,然後按姓氏,然後按名字比較,第一個非零比較結果短路。如果你使用結果進行排序,那麼它將按年齡進行排序,然後按姓氏排序,然後按名字排序。
所以使用Groovy,0
被認爲是假
什麼該行正在做的是比較age
到other.age
,如果他們是相同的(0
)然後比較lastName
到other.lastName
,等...
所以,這將返回基於幾個屬性的事物的順序,優先順序爲
我無法找到運算符優先級的具體引用,但使用groovyconsole(以及我個人使用它們的經驗與您列出的方式相同)是,太空船操作員(< =>)和elvis操作員(?:)具有相同的優先級,因此被解釋爲從左到右。爲了您的例子中,結果無非是:
-1 if age < other.age
1 if age > other.age
else (age = other.age)
-1 if lastName < other.lastName
1 if lastName > other.lastName
else (age = other.age && lastName == other.lastName)
-1 if firstName < other.lastName
1 if firstName > other.firstName
0 (all three comparisons are equal)
+1 nice work:D –
'0?:-1 == -1'因爲左邊的部分變成了'false'(零),但'-1?:0 == -1'這變成-1? –
-1在常規的事實中是真的 –
@tim:哦!這對於在Groovy中使-1真正有用是有用的。真正需要的是什麼? –