Groovy Elvis,这在Elvis中是如何运作的?

时间:2011-08-14 08:33:18

标签: groovy

从Groovy的角度来看,Elvis运算符(?:)用于返回左表达式的值,如果它的计算结果为true,则返回右表达式的值。但是如果代码是这样的话会发生什么:

  

年龄< => other.age ?: lastName< => other.lastName?:firstName< =>   other.firstName

它如何执行上面的代码?

感谢您的回复。

4 个答案:

答案 0 :(得分: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

以来

希望这是有道理的。看起来这个例子是用来进行年龄排序,然后是姓氏,然后是名字。

答案 1 :(得分:2)

因此,使用Groovy,0被视为错误

该行正在做的是将ageother.age进行比较,如果它们相同(0),则将lastNameother.lastName进行比较等。 ..

因此,这将按优先顺序返回基于多个属性的事物的顺序

答案 2 :(得分:1)

首先按年龄,然后按姓氏,然后按名字进行比较,在第一个非零比较结果上进行短路。如果您使用结果进行排序,那么它将按年龄排序,然后按姓氏排序,然后按名字排序。

答案 3 :(得分:1)

我无法找到关于运算符优先级的具体参考,但是使用groovyconsole的简单实验(以及我使用它们的方式与您列出的方式相同)是宇宙飞船运营商(&lt; = &gt;)和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)