
Потрійний умовний оператор (ternary operator) в Groovy може поводитися "дивно", якщо не звертати увагу на його особливості. Він має форму:
condition ? trueValue : falseValue
Наприклад:
def a = 5
def b = 10
def max = a > b ? a : b
println "Максимальне значення: $max"
Дуже зручно використовувати для типових значень, якщо вхідні дані не задано:
def input_a = 3
a = input_a ?: 5 // Якщо a не задано, то буде 5
b = input_b ?: 10 // Якщо b не задано, то буде 10
Але, через те що оператор використовує для порівняння булеві значення його поведінка може бути неочікуваною ящо вхідні дані вже є булевими. Наприклад:
def input_a = false
def a = input_a ?: true
def input_b = true
def b = input_b ?: true
// a = true
// b = true
☝️ input_a існує, але його значення false не задовольняє умову, тому a отримає значення true. Хоча, якщо змінна існувала, то його значення може бути використано і нема сенсу його перевизначати.
Отже, при використанні булевих вхідних даних їх треба явно перевіряти, наприклад на null, чи іншими явними способами:
def input_a = false
// def a = input_a ?: true
def a = input_a != null ? input_a : true
def args = []
// def b = args.b ?: true
def b = args.containsKey("b") ? args.b : true
Не пригадую як в інших мовах, але мабуть є схожа поведінка.
Елвіс живий?
Один з варіантів тернарі оператора — це "елвіс" оператор ?:, який дозволяє скоротити запис, бо ми вказуємо лише значення, яке буде використано, якщо умова не виконується:
def a = input_a ?: true
Його назва походить від схожості з профілем голови Елвіса Преслі, запис ?: нагадує смайлик з його шевелюрою.
