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 和可能更多的人不会 )
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 和可能更多的人不会 )