En ciertos lenguajes de programación informática , el operador Elvis , a menudo escrito como ?:
, es un operador binario que devuelve el primer operando evaluado si ese operando se evalúa como un valor similar a un valor lógicamente verdadero (según una convención dependiente del lenguaje, en otras palabras, un valor verdadero ), y de lo contrario devuelve el segundo operando evaluado (en cuyo caso el primer operando se evaluó como un valor similar a un valor lógicamente falso , en otras palabras, un valor falso ). Esto es idéntico a un cortocircuito o con semántica de "último valor". La notación del operador Elvis se inspiró en el operador condicional ternario , ? :
, ya que la expresión del operador Elvis A ?: B
es aproximadamente equivalente a la expresión condicional ternaria A ? A : B
.
El nombre "operador Elvis" se refiere al hecho de que cuando su notación común, ?:
, se ve de lado, se parece a un emoticón de Elvis Presley con su peinado característico . [1]
Un operador similar es el operador de fusión de valores nulos , en el que la comprobación de veracidad booleana se reemplaza por una comprobación de valores no nulos . Esto suele escribirse como ??
, y se puede ver en lenguajes como C# [2] o Dart . [3]
En varios lenguajes, como Common Lisp , Clojure , Lua , Object Pascal , Perl , Python , Ruby y JavaScript , el operador de disyunción lógica (normalmente ||
or or
) tiene el mismo comportamiento que el anterior: devuelve su primer operando si se evaluaría como un valor verdadero y, en caso contrario, evalúa y devuelve su segundo operando, que puede ser un valor verdadero o falso. Cuando el lado izquierdo es verdadero, el lado derecho ni siquiera se evalúa; se " cortocircuita ". Esto es diferente del comportamiento en otros lenguajes como C/C++, donde el resultado de ||
siempre será un booleano (adecuado).
En un lenguaje que admita el operador Elvis, algo como esto:
x = f() ?: g()
será x
igual al resultado de f()
si ese resultado es verdadero, y al resultado de en g()
caso contrario.
Es equivalente a este ejemplo, utilizando el operador ternario condicional :
x = f() ? f() : g()
excepto que no se evalúa f()
dos veces si arroja un resultado verdadero. Nótese la posibilidad de un comportamiento arbitrario si f()
no es una función independiente del estado que siempre devuelve el mismo resultado.
Este código generará una referencia a un objeto que se garantiza que no será nulo. La función f()
devuelve una referencia a un objeto en lugar de un valor booleano y puede devolver un valor nulo, que se considera universalmente falso:
x = f() ?: "default value"
?:
está documentado como un operador distinto; [6] esta característica se agregó en Groovy 1.5 [7] (diciembre de 2007). Groovy, a diferencia de GNU C y PHP, no permite?:
simplemente omitir el segundo operando de ternario ; en cambio, el binario ?:
debe escribirse como un solo operador, sin espacios en blanco entre ellos.?:
operador binario que compara su primer operando con null
.return
, de esta manera:val foo = bar() ?: return
?:
operador devuelve el operando derecho si el izquierdo también es nulo.?.
se denomina "operador Elvis", [10] pero no realiza la misma función. En cambio, la realiza el operador de fusión nula ??
.?:
sintaxis.isNonnull($a) ? $a : $b
. [12]L ?: R
devuelve el valor de L
si no es nulo. De lo contrario, devuelve el valor de R
. [13]??
) es un operador lógico que devuelve su operando del lado derecho cuando su operando del lado izquierdo es null
o undefined
, y de lo contrario devuelve su operando del lado izquierdo. [14]?.
<=>
se llama operador Elvis porque utiliza un signo de interrogación y dos puntos juntos (?:); si lo miras de lado, te recuerda a Elvis Presley.