Elvis operator

Source: Wikipedia, the free encyclopedia.

In certain

? :
, since the Elvis operator expression A ?: B is approximately equivalent to the ternary conditional expression A ? A : B.

The name "Elvis operator" refers to the fact that when its common notation, ?:, is viewed sideways, it resembles an emoticon of Elvis Presley with his signature hairstyle.[1]

A similar operator is the null coalescing operator, where the boolean truth(iness) check is replaced with a check for non-null instead. This is usually written ??, and can be seen in languages like C#[2] or Dart.[3]

Alternative syntaxes

In several languages, such as Common Lisp, Clojure, Lua, Object Pascal, Perl, Python, Ruby, and JavaScript, the OR operator (typically || or or) has the same behavior as the above: returning its first operand if it would evaluate to a truthy value, and otherwise evaluating and returning its second operand, which may be a truthy or falsy value. When the left-hand side is truthy, the right-hand side is not even evaluated; it is "short-circuited". This is different than the behavior in other languages such as C/C++, where the result of || will always be a (proper) boolean.

Example

Boolean variant

In a language that supports the Elvis operator, something like this:

x = f() ?: g()

will set x equal to the result of f() if that result is truthy, and to the result of g() otherwise.

It is equivalent to this example, using the

conditional ternary operator
:

x = f() ? f() : g()

except that it does not evaluate f() twice if it yields truthy. Note the possibility of arbitrary behaviour if f() is not a state-independent function that always returns the same result.

Object reference variant

This code will result in a reference to an object that is guaranteed to not be null. Function f() returns an object reference instead of a boolean, and may return null, which is universally regarded as falsy:

x = f() ?: "default value"

Languages supporting the Elvis operator

  • Perl since version v5.10 provides the Logical Defined Or operator: //, equivalent to defined $a ? $a : $b [4]
  • In GNU C and C++ (that is: in C and C++ with GCC extensions), the second operand of the ternary operator is optional.[5] This has been the case since at least GCC 2.95.3 (March 2001), and seems to be the original Elvis operator.[6]
  • In
    Apache Groovy, the "Elvis operator" ?: is documented as a distinct operator;[7] this feature was added in Groovy 1.5[8]
    (December 2007). Groovy, unlike GNU C and PHP, does not simply allow the second operand of ternary ?: to be omitted; rather, binary ?: must be written as a single operator, with no whitespace in between.
  • In PHP, it is possible to leave out the middle part of the ternary operator since PHP 5.3.[9] (June 2009).
  • The Fantom programming language has the ?: binary operator that compares its first operand with null.
  • In Kotlin, the Elvis operator returns its left-hand side if it is not null, and its right-hand side otherwise.[10] A common pattern is to use it with return, like this: val foo = bar() ?: return
  • In Gosu, the ?: operator returns the right operand if the left is null as well.
  • In
    null-coalescing operator
    ?? does.
  • In
    CFML
    , the Elvis operator was introduced using the ?: syntax.
  • The Xtend programming language has an Elvis operator.[12]
  • In Google's Closure Templates, the Elvis operator is a null coalescing operator, equivalent to isNonnull($a) ? $a : $b.[13]
  • In Ballerina, the Elvis operator L ?: R returns the value of L if it's not nil. Otherwise, return the value of R.[14]
  • In JavaScript, the nullish coalescing (??) operator is a logical operator that returns its right-hand side operand when its left-hand side operand is null or undefined, and otherwise returns its left-hand side operand.[15]

See also

References