Оператор Элвиса
В некоторых программирования языках оператор Элвиса часто пишется ?:
, — это бинарный оператор , который возвращает вычисленный первый операнд, если этот операнд оценивается как значение, подобное логически истинному (в соответствии с соглашением, зависящим от языка, другими словами, истинное значение), и в противном случае возвращает вычисленный второй операнд (в котором случае, когда первый операнд оценивается как значение, сравнимое с логически ложным , другими словами, ложное значение). Это идентично короткому замыканию или семантике «последнего значения». Обозначение оператора Элвиса было вдохновлено тернарным условным оператором , ? :
, поскольку выражение оператора Элвиса A ?: B
примерно эквивалентно троичному условному выражению A ? A : B
.
Название «оператор Элвиса» относится к тому факту, что в его общепринятом обозначении ?:
, если смотреть сбоку, он напоминает смайлик Элвиса Пресли с его фирменной прической . [1]
Аналогичным оператором является оператор объединения значений NULL , в котором логическая проверка истинности (истинности) заменяется проверкой на ненулевое значение . Обычно это пишут ??
и его можно увидеть в таких языках, как C# [2] или Дарт . [3]
Альтернативные синтаксисы
[ редактировать ]В некоторых языках, таких как Common Lisp , Clojure , Lua , Object Pascal , Perl , Python , Ruby и JavaScript , оператор логического дизъюнкции (обычно ||
или or
) имеет то же поведение, что и выше: возвращает свой первый операнд, если он будет иметь истинное значение, и в противном случае оценивает и возвращает свой второй операнд, который может быть истинным или ложным значением. Когда левая часть правдива, правая часть даже не оценивается; оно « закорочено ». Это отличается от поведения в других языках, таких как C/C++, где результат ||
всегда будет (правильным) логическим значением.
Пример
[ редактировать ]Логический вариант
[ редактировать ]На языке, поддерживающем оператор Элвиса, примерно так:
x = f() ?: g()
установит x
равен результату f()
если этот результат истинен, и к результату g()
в противном случае.
Это эквивалентно этому примеру с использованием условного тернарного оператора :
x = f() ? f() : g()
за исключением того, что он не оценивает f()
дважды, если это окажется правдой. Обратите внимание на возможность произвольного поведения, если f()
не является независимой от состояния функцией, которая всегда возвращает один и тот же результат.
Вариант ссылки на объект
[ редактировать ]Результатом этого кода будет ссылка на объект, который гарантированно не будет нулевым. Функция f()
возвращает ссылку на объект вместо логического значения и может возвращать значение null, что повсеместно считается ложным:
x = f() ?: "default value"
Языки, поддерживающие оператора Elvis
[ редактировать ]- В GNU C и C++ (то есть в C и C++ с расширениями GCC ) второй операнд тернарного оператора является необязательным. [4] Это имело место, по крайней мере, начиная с GCC 2.95.3 (март 2001 г.), и, похоже, это оригинальный оператор Элвиса. [5]
- В Apache Groovy «оператор Элвиса»
?:
документируется как отдельный оператор; [6] эта функция была добавлена в Groovy 1.5. [7] (декабрь 2007 г.). Groovy, в отличие от GNU C и PHP, не позволяет просто использовать второй операнд троичного числа.?:
быть опущено; скорее двоичный?:
должен быть записан как один оператор, без пробелов между ними. - В PHP можно исключить среднюю часть тернарного оператора, начиная с PHP 5.3. [8] (июнь 2009 г.).
- Язык программирования Fantom имеет
?:
бинарный оператор, который сравнивает свой первый операнд сnull
. - В Kotlin оператор Элвиса возвращает свою левую часть, если она не равна нулю, и правую часть в противном случае. [9] Распространенным шаблоном является использование его с
return
, так:val foo = bar() ?: return
- В Госу ,
?:
оператор возвращает правый операнд, если левый также равен нулю. - В C# условный с нулевым значением оператор
?.
упоминается как «оператор Элвиса», [10] но он не выполняет ту же функцию. Вместо этого оператор объединения нулей??
делает. - В ColdFusion и CFML оператор Элвиса был введен с помощью
?:
синтаксис. - В языке программирования Xtend есть оператор Элвиса. [11]
- Google В шаблонах закрытия оператор Элвиса является нулевым оператором объединения , эквивалентным
isNonnull($a) ? $a : $b
. [12] - В «Балерине» оператор Элвиса
L ?: R
возвращает значениеL
если оно не ноль. В противном случае верните значениеR
. [13] - В JavaScript нулевое объединение (
??
) — это логический оператор, который возвращает свой правый операнд, когда его левый операнд равенnull
илиundefined
, а в противном случае возвращает свой левый операнд. [14]
См. также
[ редактировать ]?:
или условный оператор , если он используется как тернарный оператор- Оператор безопасной навигации , часто
?.
- Оператор космического корабля
<=>
- Тип опции
Ссылки
[ редактировать ]- ^ Джойс Фаррелл (7 февраля 2013 г.). Java-программирование . п. 276. ИСБН 978-1285081953 .
Новый оператор называется оператором Элвиса, потому что он использует вместе вопросительный знак и двоеточие (?:); если посмотреть на него сбоку, он напоминает вам Элвиса Пресли.
- ^ «?? Оператор» . Справочник по С# . Майкрософт . Проверено 5 декабря 2018 г.
- ^ «Условные выражения» . Дартский язык . Google.
- ^ «Использование коллекции компиляторов GNU (GCC): условные выражения с опущенными операндами» . gcc.gnu.org .
- ^ «Использование и портирование коллекции компиляторов GNU (GCC): расширения C» . gcc.gnu.org .
- ^ «Элвис Оператор (?:)» .
- ^ «Язык программирования Apache Groovy — примечания к выпуску Groovy 1.5» . groovy-lang.org .
- ^ «PHP: Операторы сравнения — Руководство» . PHP-сайт . Проверено 17 февраля 2014 г.
- ^ «Null Safety — язык программирования Kotlin» . Котлин .
- ^ Альбахари, Джозеф; Альбахари, Бен (2015). Вкратце о C# 6.0 (6-е изд.). О'Рейли Медиа. п. 59. ИСБН 978-1491927069 .
- ^ Эффтинге, Свен. «Xtend — Выражения» . eclipse.org .
- ^ «Шаблоны закрытия — выражения» . Гитхаб . 29 октября 2021 г.
- ^ «Оператор Элвиса — язык программирования балерины» . Балерина . Архивировано из оригинала 20 декабря 2018 г. Проверено 19 декабря 2018 г.
- ^ «Нулевой оператор объединения (??) — JavaScript | MDN» . http://developer.mozilla.org . Проверено 5 января 2023 г.