Обзор тернарных операторов в разных языках программирования
Обычно тернарная условная операция ассоциируется с операцией ?: (
condition ? true value : false value), но в разных языках она выглядит по разному и я хотел бы рассмотреть её на примере получения модуля числа.
C/C++/C#/Java/Javascript
Стандартная запись для большинства языков.
Текущий вид тернарный оператор приобрел в версии 2.5 и описан в
PEP-308. Такую форму он имеет благодаря
Гвидо.
x if x > 0 else -x
На StackOveflow увидел как можно сделать тоже самое "немного" иначе:
1. (-x, x)[x > 0]
2. x > 0 and x or -x
Википедия приводит пример как можно использовать тернарный оператор в похожей на switch манере
b = 3
a = 1 if b==1 else \
2 if b==2 else \
3
Visual Basic
В VB такой вариант записи работает с 9 ой версии.
If(x > 0, x, -x)
До этого для этих целей могла использоваться тернарная функция
Iif(x > 0, x, -x)
но так как она являлась функцией все её параметры должны быть определены до вызова функции. Например, в следующем случае
Iif(x <> 0, 10/x, x)
выражение 10/x посчиталось бы даже если x = 0 (что привело бы к ошибке), чего бы не произошло при использовании тренарного оператора If который появился в 9ой версии VB.
Переключатель (case) с помощью тернарного оператора
Пока писал про тренанрный оператор неожиданно узнал для себя что можно использовать тернарный оператор как аналог switch case. Вот еще пример с синтаксисом Си.
vehicle = arg == 'B' ? bus :
arg == 'A' ? airplane :
arg == 'T' ? train :
arg == 'C' ? car :
arg == 'H' ? horse :
feet;
Null coalescing operator
Пока смотрел что есть про тернарный оператор набрел на null coalescing operator(не знаю как он правильно переводится на русский так что так его называть и буду). Он в каком-то смысле сродни тернарному оператору. Например в C# он выглядит так
possiblyNullValue ?? valueIfNull
Смысл же его заключается в том чтобы вернуть вторую переменную если первая оказалась равна null.
Допустим следующее - если название не определено нам нужно получить название по умолчанию. Вот как можно сделать это с помощью тернарного оператора.
string pageTitle = (suppliedTitle == null) ? "Default Title" : suppliedTitle;
Или же мы можем воспользоваться null coalescing оператором
string pageTitle = suppliedTitle ?? "Default Title";
Этот оператор можно также найти и ряде других языков. В Python он отсутствует как отдельный оператор, но такое же поведение можно получить при использовании or.
foo = None
bar = foo or 1 # теперь bar == 1
Но в Python даже если бы foo был пустой строкой или нулем bar стал бы равен 1.