суббота, 24 марта 2012 г.

Тернарный оператор в разных языках

Обзор тернарных операторов в разных языках программирования
Обычно тернарная условная операция ассоциируется с операцией ?: (condition ? true value : false value), но в разных языках она выглядит по разному и я хотел бы рассмотреть её на примере получения модуля числа.
C/C++/C#/Java/Javascript
Стандартная запись для большинства языков.
 (x > 0) ? x : -x; 
Python
Текущий вид тернарный оператор приобрел в версии 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.