Jump to content

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

В некоторых программирования языках оператор Элвиса часто пишется ?:, — это бинарный оператор , который возвращает вычисленный первый операнд, если этот операнд оценивается как значение, подобное логически истинному (в соответствии с соглашением, зависящим от языка, другими словами, истинное значение), и в противном случае возвращает вычисленный второй операнд (в котором случае, когда первый операнд оценивается как значение, сравнимое с логически ложным , другими словами, ложное значение). Это идентично короткому замыканию или семантике «последнего значения». Обозначение оператора Элвиса было вдохновлено тернарным условным оператором , ? :, поскольку выражение оператора Элвиса 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]

См. также

[ редактировать ]
  1. ^ Джойс Фаррелл (7 февраля 2013 г.). Java-программирование . п. 276. ИСБН  978-1285081953 . Новый оператор называется оператором Элвиса, потому что он использует вместе вопросительный знак и двоеточие (?:); если посмотреть на него сбоку, он напоминает вам Элвиса Пресли.
  2. ^ «?? Оператор» . Справочник по С# . Майкрософт . Проверено 5 декабря 2018 г.
  3. ^ «Условные выражения» . Дартский язык . 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-сайт . Проверено 17 февраля 2014 г.
  9. ^ «Null Safety — язык программирования Kotlin» . Котлин .
  10. ^ Альбахари, Джозеф; Альбахари, Бен (2015). Вкратце о C# 6.0 (6-е изд.). О'Рейли Медиа. п. 59. ИСБН  978-1491927069 .
  11. ^ Эффтинге, Свен. «Xtend — Выражения» . eclipse.org .
  12. ^ «Шаблоны закрытия — выражения» . Гитхаб . 29 октября 2021 г.
  13. ^ «Оператор Элвиса — язык программирования балерины» . Балерина . Архивировано из оригинала 20 декабря 2018 г. Проверено 19 декабря 2018 г.
  14. ^ «Нулевой оператор объединения (??) — JavaScript | MDN» . http://developer.mozilla.org . Проверено 5 января 2023 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b4f8ee255597ba9e02dba19b87c2dd51__1721661420
URL1:https://arc.ask3.ru/arc/aa/b4/51/b4f8ee255597ba9e02dba19b87c2dd51.html
Заголовок, (Title) документа по адресу, URL1:
Elvis operator - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)