В некоторых языках программирования оператор Элвиса , часто записываемый как ?:
, является бинарным оператором , который возвращает вычисленный первый операнд, если этот операнд оценивается как значение, сравнимое с логически истинным (в соответствии с соглашением, зависящим от языка, другими словами, истинное значение), и в противном случае возвращает вычисленный второй операнд (в этом случае первый операнд оценивается как значение, сравнимое с логически ложным , другими словами, ложное значение). Это идентично короткому замыканию или семантике «последнего значения». Нотация оператора Элвиса была вдохновлена тернарным условным оператором , ? :
, поскольку выражение оператора Элвиса 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"
?:
документирован как отдельный оператор; [6] эта функция была добавлена в Groovy 1.5 [7] (декабрь 2007 г.). Groovy, в отличие от GNU C и PHP, не?:
позволяет просто опускать второй операнд тернарного оператора ; вместо этого двоичный оператор ?:
должен быть записан как один оператор без пробелов между ними.?:
бинарный оператор, который сравнивает свой первый операнд с null
.return
, например:val foo = bar() ?: return
?:
возвращает правый операнд, если левый также равен нулю.?.
«оператором Элвиса» [10] , но он не выполняет ту же функцию. Вместо этого выполняет оператор null-coalescing ??
.?:
синтаксиса.isNonnull($a) ? $a : $b
. [12]L ?: R
возвращает значение , L
если оно не равно нулю. В противном случае вернуть значение R
. [13]??
) является логическим оператором, который возвращает свой правый операнд, если его левый операнд равен null
или undefined
, а в противном случае возвращает свой левый операнд. [14]?.
<=>
Новый оператор называется оператором Элвиса, потому что он использует вопросительный знак и двоеточие вместе (?:); если посмотреть на него сбоку, он напоминает Элвиса Пресли.