2011-08-14 19 views
1

從Groovy的角度來看,如果Elvis運算符(?:)的計算結果爲true,則返回左表達式的值,否則返回右表達式的值。但是,如果代碼是什麼情況是這樣的:Groovy Elvis,這在Elvis中如何工作?

年齡< => other.age:lastName的< => other.lastName:?的firstName < => other.firstName

如何它執行上面的代碼?

感謝您的回覆。

回答

4

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

希望是有道理的。看起來這個例子是用來對年齡進行排序的,然後是姓氏,然後是名字。

+0

'0?:-1 == -1'因爲左邊的部分變成了'false'(零),但'-1?:0 == -1'這變成-1? –

+2

-1在常規的事實中是真的 –

+0

@tim:哦!這對於在Groovy中使-1真正有用是有用的。真正需要的是什麼? –

1

它首先按年齡比較,然後按姓氏,然後按名字比較,第一個非零比較結果短路。如果你使用結果進行排序,那麼它將按年齡進行排序,然後按姓氏排序,然後按名字排序。

2

所以使用Groovy,0被認爲是假

什麼該行正在做的是比較ageother.age,如果他們是相同的(0)然後比較lastNameother.lastName,等...

所以,這將返回基於幾個屬性的事物的順序,優先順序爲

1

我無法找到運算符優先級的具體引用,但使用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) 
+0

+1 nice work:D –