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 ?: Bes 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]
Sintaxis alternativas
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).
Ejemplo
Variante booleana
En un lenguaje que admita el operador Elvis, algo como esto:
x = f() ?: g()
será xigual 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.
Variante de referencia de objeto
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"
Idiomas compatibles con el operador Elvis
- En GNU C y C++ (es decir: en C y C++ con extensiones GCC ), el segundo operando del operador ternario es opcional. [4] Esto ha sido así desde al menos GCC 2.95.3 (marzo de 2001), y parece ser el operador Elvis original. [5]
- En Apache Groovy , el "operador Elvis"
?: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. - En PHP , es posible omitir la parte media del operador ternario desde PHP 5.3. [8] (junio de 2009).
- El lenguaje de programación Fantom tiene el
?:operador binario que compara su primer operando connull. - En Kotlin , el operador Elvis devuelve su lado izquierdo si no es nulo, y su lado derecho en caso contrario. [9] Un patrón común es usarlo con
return, de esta manera:val foo = bar() ?: return - En Gosu , el
?:operador devuelve el operando derecho si el izquierdo también es nulo. - En C# , el operador condicional nulo
?.se denomina "operador Elvis", [10] pero no realiza la misma función. En cambio, la realiza el operador de fusión nula??. - En ColdFusion y CFML , se introdujo el operador Elvis mediante la
?:sintaxis. - El lenguaje de programación Xtend tiene un operador Elvis. [11]
- En las plantillas de cierre de Google , el operador Elvis es un operador de coalescencia nula , equivalente a
isNonnull($a) ? $a : $b. [12] - En Ballerina , el operador Elvis
L ?: Rdevuelve el valor deLsi no es nulo. De lo contrario, devuelve el valor deR. [13] - En JavaScript , el operador de fusión nula (
??) es un operador lógico que devuelve su operando del lado derecho cuando su operando del lado izquierdo esnulloundefined, y de lo contrario devuelve su operando del lado izquierdo. [14]
Véase también
?:o operador condicional , cuando se utiliza como operador ternario- Operador de navegación segura , a menudo
?. - Operador de nave espacial
<=> - Tipo de opción
Referencias
- ^ Joyce Farrell (7 de febrero de 2013). Programación en Java . p. 276. ISBN 978-1285081953El nuevo operador
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.
- ^ "Operador ??". Referencia de C# . Microsoft . Consultado el 5 de diciembre de 2018 .
- ^ "Expresiones condicionales". Lenguaje Dart . Google.
- ^ "Uso de la colección de compiladores GNU (GCC): Condicionales con operandos omitidos". gcc.gnu.org .
- ^ "Uso y portabilidad de la colección de compiladores GNU (GCC): extensiones de C". gcc.gnu.org .
- ^ "Operador Elvis (?: )".
- ^ "El lenguaje de programación Apache Groovy - Notas de la versión de Groovy 1.5". groovy-lang.org .
- ^ "PHP: Operadores de comparación - Manual". Sitio web de PHP . Consultado el 17 de febrero de 2014 .
- ^ "Seguridad nula - Lenguaje de programación Kotlin". Kotlin .
- ^ Albahari, José; Albahari, Ben (2015). C# 6.0 en pocas palabras (6 ed.). Medios O'Reilly. pag. 59.ISBN 978-1491927069.
- ^ Efftinge, Sven. "Xtend - Expresiones". eclipse.org .
- ^ "Plantillas de cierre: expresiones". GitHub . 29 de octubre de 2021.
- ^ "Operador Elvis - Lenguaje de programación Ballerina". Ballerina . Archivado desde el original el 2018-12-20 . Consultado el 19-12-2018 .
- ^ "Operador de fusión nulo (??) - JavaScript | MDN". developer.mozilla.org . Consultado el 5 de enero de 2023 .