从Groovy的角度来看,Elvis运算符(?:
)用于返回左表达式的值,如果它的计算结果为true
,则返回右表达式的值。但是如果代码是这样的话会发生什么:
年龄< => other.age ?: lastName< => other.lastName?:firstName< => other.firstName
它如何执行上面的代码?
感谢您的回复。
答案 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
被视为错误
该行正在做的是将age
与other.age
进行比较,如果它们相同(0
),则将lastName
与other.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)