Groovy 的三元条件运算符是否存在字符串表达式错误?

Does Groovy's ternary conditional operator have a bug in string expressions?

Groovy 的三元条件运算符在这段代码中有一个非常奇怪的行为:

def f = true
println 'a' + f?'b':'z' + 'c'   // b

f = false
println 'a' + f?'b':'z' + 'c'   // b

它在两种情况下都打印 b 并在没有警告的情况下忽略其他两个字符串!这是 Groovy 编译器中的错误吗?

如果使用数字代替字符串,则会生成错误:

def f = true
println 1 + f?2:3 + 3           // Error: Cannot find matching method int#plus(boolean).

括号修复问题:

def f = true
println 'a' + (f?'b':'z') + 'c' // abc
println 1 + (f?2:3) + 3         // 6

有人可以解释这种行为吗?

这一切都与运算符优先级有关。

大多数* 语言都有运算符的优先级规则(当有多个选项时,先采用哪个运算符)。 Groovys order can be found here.

如您所见,+排在第5位,但三元排在第14位

这意味着 Groovy 将您的表达式解析为(添加括号以显示):

('a' + f) ? 'b' : ('z' + 'c')

当你填写变量时,就变成了

('atrue') ? 'b' : ('zc')

在groovy中,任何非空(和非空)字符串在作为布尔值时都被认为是true,所以上面的结果是b

如您所见,答案是添加括号以向解析器显示您实际需要的内容

(* Lisps、Forth 和可能更多的人不会 )