Есть ли в терновом условном операторе Groovy ошибка в строковых выражениях? - PullRequest
2 голосов
/ 28 сентября 2019

Оператор троичного условия 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

Может кто-нибудь объяснить это поведение?

1 Ответ

3 голосов
/ 28 сентября 2019

Это все связано с приоритетом оператора.

Большинство * языков имеют правило приоритета для операторов (какие выбираются первыми, когда есть несколько опций). Порядок Groovys можно найти здесь .

Как видите, + входит в позицию 5, но троичный входит в низкую 14

Это означает, чтоGroovy анализирует ваше выражение как (добавлены скобки, чтобы показать):

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

, который при заполнении переменных становится

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

В groovy любой непустой (и ненулевой)Строка считается true, если она принимается как логическое значение, поэтому результат приведенного выше будет b

. Как вы видели, ответ заключается в добавлении скобок, чтобы показать парсеру, что вы на самом деле хотите

(* Lisps, Forth и, вероятно, больше не ?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...