stringtranslate.com

Элвис оператор

В некоторых языках программирования оператор Элвиса , часто записываемый как ?:, является бинарным оператором , который возвращает вычисленный первый операнд, если этот операнд оценивается как значение, сравнимое с логически истинным (в соответствии с соглашением, зависящим от языка, другими словами, истинное значение), и в противном случае возвращает вычисленный второй операнд (в этом случае первый операнд оценивается как значение, сравнимое с логически ложным , другими словами, ложное значение). Это идентично короткому замыканию или семантике «последнего значения». Нотация оператора Элвиса была вдохновлена ​​тернарным условным оператором , ? :, поскольку выражение оператора Элвиса A ?: Bприблизительно эквивалентно тернарному условному выражению A ? A : B.

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

Похожий оператор — это оператор объединения null , где проверка истинности булевой переменной заменяется проверкой на ненулевое значение . Обычно это записывается ??и может быть замечено в таких языках, как C# [2] или Dart . [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()возвращает ссылку на объект вместо логического значения и может вернуть нуль, что повсеместно считается ложным:

x = f() ?: "default value"

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

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

Ссылки

  1. ^ Джойс Фаррелл (7 февраля 2013 г.). Программирование на Java . Cengage Learning. стр. 276. ISBN 978-1285081953. Новый оператор называется оператором Элвиса, потому что он использует вопросительный знак и двоеточие вместе (?:); если посмотреть на него сбоку, он напоминает Элвиса Пресли.
  2. ^ "Оператор??". Справочник по C# . Microsoft . Получено 5 декабря 2018 г.
  3. ^ "Условные выражения". Dart Language . Google.
  4. ^ «Использование коллекции компиляторов GNU (GCC): условные операторы с пропущенными операндами». gcc.gnu.org .
  5. ^ «Использование и портирование коллекции компиляторов GNU (GCC): расширения C». gcc.gnu.org .
  6. ^ "Оператор Элвиса (?: )".
  7. ^ "Язык программирования Apache Groovy - заметки о выпуске Groovy 1.5". groovy-lang.org .
  8. ^ "PHP: Операторы сравнения - Руководство". Веб-сайт PHP . Получено 2014-02-17 .
  9. ^ "Безопасность нулей - язык программирования Kotlin". Kotlin .
  10. ^ Альбахари, Джозеф; Альбахари, Бен (2015). Вкратце о C# 6.0 (6-е изд.). О'Рейли Медиа. п. 59. ИСБН 978-1491927069.
  11. ^ Эффтинг, Свен. "Xtend - Expressions". eclipse.org .
  12. ^ "Шаблоны закрытия - Выражения". GitHub . 29 октября 2021 г.
  13. ^ "Elvis Operator - Ballerina Programming Language". Ballerina . Архивировано из оригинала 2018-12-20 . Получено 19-12-2018 .
  14. ^ "Оператор нулевого объединения (??) - JavaScript | MDN". developer.mozilla.org . Получено 2023-01-05 .