Підступний умовний оператор в Groovy

Groovy ternaly operator logic

Потрійний умовний оператор (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

Його назва походить від схожості з профілем голови Елвіса Преслі, запис ?: нагадує смайлик з його шевелюрою.

Elvis Presley


  1. Головна ілюстрація від www.scaler.com 

  2. Ілюстрація Елвіса від www.supercoloring.com 


Коментарі