Оператор Элвиса - Википедия - Elvis operator

В определенных компьютерное программирование языки, Оператор Элвиса, часто пишется ?:, или же или же ||, это бинарный оператор который возвращает свой первый операнд, если этот операнд оценивается как истинное значение, а в противном случае оценивает и возвращает свой второй операнд. Это идентично короткое замыкание или же с семантикой "последнее значение". Обозначение оператора Элвиса было вдохновлено троичными условный оператор, ? : поскольку выражение оператора Элвиса А?: B примерно эквивалентно тернарному условному А? А: Б.

Название «Оператор Элвиса» относится к тому факту, что при его общепринятом обозначении ?:, при взгляде сбоку, напоминает смайлик из Элвис Пресли с его причёска.[1]

Аналогичным оператором является нулевой оператор объединения, где проверка на логическую истинность заменена проверкой на отсутствиеноль вместо. Обычно это пишется ??, и его можно увидеть на таких языках, как C #.[2]

Пример

Логический вариант

На языке, поддерживающем оператор Элвиса, примерно так:

х = f ()?: g ()

установит Икс равен результату f () если этот результат является истинным значением, и к результату грамм() иначе.

Это эквивалентно этому примеру с использованием условный тернарный оператор:

х = е ()? f (): g ()

за исключением того, что он не оценивает f () дважды, если это правда.

Вариант ссылки на объект

Этот код приведет к ссылке на объект, который гарантированно не будет нулевым. Функция f () возвращает ссылку на объект вместо логического и может возвращать значение null:

x = f ()?: "значение по умолчанию"

Языки, поддерживающие оператора Элвиса

  • В GNU C и C ++ (то есть: в C и C ++ с GCC extension), второй операнд тернарного оператора является необязательным.[3] Так было, по крайней мере, с GCC 2.95.3 (март 2001 г.), и, похоже, то оригинальный оператор Элвиса.[4]
  • В Apache Groovy, "Оператор Элвиса" ?: задокументирован как отдельный оператор;[5] эта функция была добавлена ​​в Groovy 1.5[6] (Декабрь 2007 г.). Groovy, в отличие от GNU C и PHP, нет просто разрешите второй операнд тернарного ?: быть опущенным; скорее двоичный ?: должен быть записан как один оператор без пробелов между ними.
  • В PHP, можно опустить среднюю часть тернарного оператора, начиная с PHP 5.3.[7] (Июнь 2009 г.).
  • В Фантом язык программирования имеет ?: бинарный оператор, который сравнивает свой первый операнд с ноль.
  • В Котлин, оператор Элвиса возвращает его левую часть, если она не равна нулю, и ее правую часть в противном случае.[8] Распространенный шаблон - использовать его с возвращаться, так: val foo = bar ()?: возврат
  • В Госу, то ?: оператор возвращает правый операнд, если левый также равен нулю.
  • В C #, то null-условный оператор ?. называется «оператор Элвиса»,[9] но он не выполняет ту же функцию. Вместо этого оператор объединения с нулем ?? делает.
  • В Холодный синтез и CFML, оператор Элвиса был введен с использованием ?: синтаксис.
  • В Xtend В языке программирования есть оператор Элвиса.[10]
  • В Google Шаблоны закрытия, оператор Элвиса является нулевой оператор объединения, что эквивалентно isNonnull ($ a)? $ a: $ b.[11]
  • Быстрый поддерживает эту концепцию с помощью оператора Nil-coalescing ??,[12] например (а ?? б).
  • SQL поддерживает эту концепцию с помощью функции COALESCE, например КОАЛЕС (а, б).
  • В Балерина, оператор Элвиса L?: R возвращает значение L если это не ноль. В противном случае верните значение р.[13]
  • Clojure поддерживает эту концепцию или же[14] макрос, например (или а б). В случае Clojure это var-arg, а не двоичный, например (или a b c d e) вернет первое не ложное значение.
  • Дротик язык обеспечивает ?? оператор, который возвращает значение правой стороны, если значение левой стороны равно нулю
  • Машинопись поддерживает эту концепцию с помощью оператора объединения с нулевым значением ??, например (а ?? б), начиная с v3.7.[15]
  • Lua поддерживает эту концепцию или же[16] логический оператор, например (а или б).

Аналогичное использование короткозамкнутого оператора ИЛИ

На нескольких языках, например Common Lisp, Clojure, Lua, Perl, Python, Рубин, и JavaScript, оператор ИЛИ (обычно || или же или же) имеет то же поведение, что и выше: возвращает свой первый операнд, если он будет оцениваться как true в логической среде, и в противном случае оценивает и возвращает свой второй операнд. Когда левая часть истинна, правая часть даже не оценивается; это "закороченный. "Это отличается от поведения на других языках, таких как C / C ++, где результат || всегда будет логическим.

Смотрите также

Рекомендации

  1. ^ Джойс Фаррелл. Программирование на Java. п. 276. ISBN  978-1285081953. Новый оператор называется оператором Элвиса, потому что он использует вместе вопросительный знак и двоеточие (? :); если смотреть сбоку, он напоминает вам Элвиса Пресли.
  2. ^ «?? Оператор». Справочник по C #. Microsoft. Получено 5 декабря 2018.
  3. ^ «Использование коллекции компиляторов GNU (GCC): условные обозначения». gcc.gnu.org.
  4. ^ «Использование и перенос коллекции компиляторов GNU (GCC): расширения C». gcc.gnu.org.
  5. ^ "Оператор Элвиса (?:)".
  6. ^ «Язык программирования Apache Groovy - примечания к выпуску Groovy 1.5». groovy-lang.org.
  7. ^ «PHP: операторы сравнения - Руководство». Сайт PHP. Получено 2014-02-17.
  8. ^ "Null Safety - язык программирования Kotlin". Котлин.
  9. ^ Альбахари, Джозеф; Альбахари, Бен (2015). C # 6.0 в двух словах (6 изд.). O'Reilly Media. п. 59. ISBN  978-1491927069.
  10. ^ Efftinge, Sven. «Xtend - Выражения». eclipse.org.
  11. ^ «Шаблоны закрытия - Выражения». GitHub.
  12. ^ «Язык программирования Swift (Swift 4.1): основные операторы». developer.apple.com.
  13. ^ "Оператор Элвис - язык программирования балерин". Балерина.
  14. ^ "clojure.core или справочник по API макросов".
  15. ^ "nullish coalescing commit by Kingwl · Pull Request # 32883 · microsoft / TypeScript". GitHub. Получено 2019-10-08.
  16. ^ "Ссылка на Lua или оператор".