El operador de fusión nula (llamado operador lógico definido-O en Perl ) es un operador binario que forma parte de la sintaxis de una expresión condicional básica en varios lenguajes de programación , incluido C # , [1] PowerShell a partir de la versión 7.0.0, [ 2] Perl a partir de la versión 5.10, [3] Swift , [4] y PHP 7.0.0. [5] Si bien su comportamiento difiere entre implementaciones, el operador de fusión nula generalmente devuelve el resultado de su operando más a la izquierda si existe y nonull y, de lo contrario, devuelve el operando más a la derecha. Este comportamiento permite definir un valor predeterminado para los casos en los que no se dispone de un valor más específico.
En contraste con el operador if ternario condicional usado como x ? x : y
, pero como el operador binario de Elvis usado como x ?: y
, el operador coalescente nulo es un operador binario y por lo tanto evalúa sus operandos como máximo una vez, lo cual es significativo si la evaluación de x
tiene efectos secundarios .
Ejemplos por idiomas
Intento
En Bash "Si el parámetro no está configurado o es nulo, se sustituye la expansión de la palabra . De lo contrario, se sustituye el valor del parámetro ": [6]
# supplied_title = 'título suministrado' # Quitar esta línea para usar el título suministrado título = $ { supplied_title : - 'Título predeterminado' } echo " $ título " # impresiones: Título predeterminado
C#
En C # , el operador de fusión nulo es ??
.
Se usa con mayor frecuencia para simplificar expresiones de la siguiente manera:
posiblemente NullValue ?? valueIfNull
Por ejemplo, si uno desea implementar algún código C # para darle a una página un título predeterminado si no hay ninguno, puede usar la siguiente declaración:
string pageTitle = proporcionadoTitle ?? "Título predeterminado" ;
en lugar del más detallado
string pageTitle = ( titulo suministrado ! = null ) ? SuppliedTitle : "Título predeterminado" ;
o
string pageTitle ;if ( titulo suministrado ! = nulo ) { titulo pagina = titulo suministrado ; } else { pageTitle = "Título predeterminado" ; }
Las tres formas dan como resultado el mismo valor que se almacena en la variable nombrada pageTitle
.
Tenga en cuenta que suppliedTitle
solo se hace referencia una vez cuando se usa el ??
operador y dos veces en los otros dos ejemplos de código.
El operador también se puede utilizar varias veces en la misma expresión:
return some_Value ?? some_Value2 ?? some_Value3 ;
Una vez que se asigna un valor no nulo al número, o se alcanza el valor final (que puede ser nulo o no), la expresión se completa.
Si, por ejemplo, una variable debe cambiarse a otro valor si su valor se evalúa como nulo, desde C # 8.0 ??=
se puede usar el operador de asignación de coalescencia nula:
some_Value ?? = some_Value2 ;
Cuál es una versión más concisa de:
algún_Valor = algún_Valor ?? some_Value2 ;
En combinación con el operador condicional nulo ?.
o el operador de acceso al elemento condicional ?[]
nulo, el operador coalescente nulo se puede utilizar para proporcionar un valor predeterminado si un objeto o el miembro de un objeto es nulo. Por ejemplo, lo siguiente devolverá el título predeterminado si el page
objeto es nulo o page
no es nulo pero su Title
propiedad es:
string pageTitle = página ?. Titulo ?? "Título predeterminado" ;
CFML
A partir de ColdFusion 11, [7] Railo 4,1, [8] CFML apoya la hipótesis nula coalescencia operador como una variación del operador ternario, ?:
. Es funcional y sintácticamente equivalente a su contraparte de C #, arriba. Ejemplo:
posiblementeNullValue?: valueIfNull
F#
El valor nulo no se usa normalmente en F # para valores o variables. [9] Sin embargo, pueden aparecer valores nulos, por ejemplo, cuando se llama al código F # desde C #.
F # no tiene un operador de fusión nulo incorporado, pero se puede definir uno según sea necesario como un operador personalizado: [10]
let (|?) lhs rhs = ( si lhs = null entonces rhs else lhs )
Este operador personalizado se puede aplicar según el operador de fusión nulo integrado de C #:
dejar que pageTitle = suppliedTitle |? "Título predeterminado"
Freemarker
Los valores faltantes en Apache FreeMarker normalmente causarán excepciones. Sin embargo, se pueden manejar tanto los valores faltantes como los nulos, con un valor predeterminado opcional: [11]
$ { missingVariable ! "defaultValue" }
o, para dejar la salida en blanco:
$ { missingVariable ! }
Haskell
Los tipos en Haskell , en general, no pueden ser nulos. La representación de cálculos que pueden o no devolver un resultado significativo está representada por el tipo Maybe genérico, definido en la biblioteca estándar [12] como
datos Quizás a = Nada | Solo un
El operador de fusión nula reemplaza los punteros nulos con un valor predeterminado. El equivalente de Haskell es una forma de extraer un valor de Quizás proporcionando un valor predeterminado. Esta es la función de Maybe.
fromMaybe :: a -> Quizás a -> a fromMaybe d x = caso x de { Nada -> d ; Solo v -> v }
A continuación se muestra un uso de ejemplo.
fromMaybe 0 ( Just 3 ) - devuelve 3 fromMaybe "" ( Nothing ) - devuelve ""
JavaScript
JavaScript 'operador cercano s es ??
, el 'operador de coalescencia nullish', que se añadió a la norma en ECMAScript ' s 11 ª edición. [13] En versiones anteriores, se podía usar a través de un complemento de Babel y en TypeScript . Evalúa su operando de la izquierda y, si el valor del resultado no es "nulo" ( null
o undefined
), toma ese valor como resultado; de lo contrario, evalúa el operando de la derecha y toma el valor resultante como resultado.
En el siguiente ejemplo, a
se le asignará el valor de b
si el valor de b
no es null
o undefined
, en caso contrario, se le asignará 3.
const a = b ?? 3 ;
Antes del operador de fusión nula, los programadores usarían el operador lógico OR ( ||
). Pero, ¿dónde ??
busca específicamente null
o undefined
, las ||
miradas de operador para cualquier Falsy valor: null
, undefined
, ""
, 0
, NaN
, y, por supuesto, false
.
En el siguiente ejemplo, a
se le asignará el valor de b
si el valor de b
es verdadero , de lo contrario se le asignará 3.
const a = b || 3 ;
Kotlin
Kotlin usa el ?:
operador. [14] Esta es una elección inusual de símbolo, dado que ?:
se usa típicamente para el operador de Elvis , no para la fusión de nulos, pero se inspiró en Groovy (lenguaje de programación) donde nulo se considera falso.
val title = providedTitle ?: "Título predeterminado"
C objetivo
En Obj-C , el operador coalescente nulo es ?:
. Se puede utilizar para proporcionar un valor predeterminado para referencias nulas:
id valor = valueThatMightBeNil ?: valueIfNil ;
Esto es lo mismo que escribir
id value = valueThatMightBeNil ? valueThatMightBeNil : valueIfNil ;
Perl
En Perl (comenzando con la versión 5.10), el operador es //
y el código Perl equivalente es:
$ posiblemente_null_value // $ valor_si_null
El valor posiblemente_nulo se evalúa como nulo o no nulo (en terminología Perl, indefinido o definido ). Sobre la base de la evaluación, la expresión devuelve value_if_null cuando posiblemente_null_value es nulo, o posiblemente_null_value en caso contrario. En ausencia de efectos secundarios, esto es similar a la forma en que los operadores ternarios ( ?:
declaraciones) funcionan en los lenguajes que los admiten. El código Perl anterior es equivalente al uso del operador ternario a continuación:
definido ( $ posiblemente_nulo_valor ) ? $ valor_posiblemente_nulo : $ valor_si_nulo
El uso más común de este operador es minimizar la cantidad de código utilizado para una simple verificación nula.
Perl también tiene un //=
operador de asignación, donde
$ a // = $ b
es en gran parte equivalente a:
$ a = $ a // $ b
Este operador se diferencia de los operadores ||
y más antiguos de Perl ||=
en que considera la definición, no la verdad. Por lo tanto, se comportan de manera diferente en valores que son falsos pero definidos, como 0 o '' (una cadena de longitud cero):
$ a = 0 ; $ b = 1 ; $ c = $ a // $ b ; # $ c = 0 $ c = $ a || $ b ; # $ c = 1
PHP
PHP 7 ha introducido [15] un operador de fusión nula con la ??
sintaxis. Esto verifica estrictamente NULL o una variable / índice de matriz / propiedad inexistente. En este sentido, actúa de manera similar a la isset()
pseudo-función de PHP :
$ nombre = $ solicitud -> entrada [ 'nombre' ] ?? $ solicitud -> consulta [ 'nombre' ] ?? 'nombre predeterminado' ;/* Equivalente a */if ( isset ( $ solicitud -> entrada [ 'nombre' ])) { $ nombre = $ solicitud -> entrada [ 'nombre' ]; } elseif ( isset ( $ solicitud -> consulta [ 'nombre' ])) { $ nombre = $ solicitud -> consulta [ 'nombre' ]; } else { $ nombre = 'nombre predeterminado' ; }
$ usuario = $ esto -> getUser () ?? $ esto -> createGuestUser ();/* Equivalente a */$ usuario = $ esto -> getUser ();if ( nulo === $ usuario ) { $ usuario = $ esto -> createGuestUser (); }
$ pageTitle = $ title ?? 'Título predeterminado' ;/* Equivalente a */$ pageTitle = isset ( $ título ) ? $ title : 'Título predeterminado' ;
La versión 7.4 de PHP agregará el operador de asignación de coalescencia nula con la ??=
sintaxis: [16]
// Las siguientes líneas hacen lo mismo $ this -> request -> data [ 'comments' ] [ 'user_id' ] = $ this -> request -> data [ 'comments' ] [ 'user_id' ] ?? 'valor' ; // En lugar de repetir variables con nombres largos, se usa el operador de combinación igual $ this -> request -> data [ 'comments' ] [ 'user_id' ] ?? = 'value' ;
Pitón
Python no tiene un operador de fusión nulo. Su funcionalidad se puede imitar mediante una expresión condicional:
Ahora () si el tiempo es Ninguna otra vez
Hubo una propuesta para agregar operadores de tipo coalescente nulo en Python 3.8, pero esa propuesta se ha aplazado. [17]
Funcionalidad relacionada
El or
operador de Python proporciona un comportamiento relacionado, pero diferente. La diferencia es que or
también devuelve el término de la derecha si el primer término está definido, pero tiene un valor que se evalúa False
en un contexto booleano:
42 o "algo" # devuelve 42 0 o "algo" # devuelve "algo" Falso o "algo" # devuelve "algo" "" o "algo" # devuelve "algo" Ninguno o "algo" # devuelve "algo"
Un verdadero operador nula coalescencia sólo volvería "something"
en el último caso, y devolvería los falsos valores-ish ( 0
, False
, ""
) en los otros ejemplos.
Potencia Shell
El ??
operador de fusión nula proporciona esta funcionalidad. [2]
$ myVar = $ null $ x = $ myVar ?? "algo" # asigna "algo"
Oxido
Si bien no existe null
en Rust , las uniones etiquetadas se utilizan para el mismo propósito. Por ejemplo, Result
o Option
.
unwrap_or_else()
tiene un propósito similar al del operador de fusión nula en otros idiomas. Si el cálculo del valor predeterminado no tiene efectos secundarios, unwrap_or()
se puede utilizar como una opción más concisa (y sin optimizaciones, más eficiente).
let parsed_numbers : Vec < _ > = [ "1" , "no es un número" , "3" ] . iter () . mapa ( | n | n . parse (). desenvolver_o_else ( | _ | std :: i64 :: MIN )) . recoger ();// imprime "[1, -9223372036854775808, 3]" println! ( "{:?}" , números_parsed );
SQL
En PL / SQL de Oracle , la función NVL () proporciona el mismo resultado:
NVL ( posiblemente_null_value , 'valor si es nulo' );
En SQL Server / Transact-SQL existe la función ISNULL que sigue el mismo patrón de prototipo:
ISNULL ( posiblemente_null_value , 'valor si es nulo' );
Se debe tener cuidado de no confundir ISNULL con IS NULL ; este último sirve para evaluar si algunos contenidos se definen como NULL o no.
El estándar ANSI SQL-92 incluye la función COALESCE implementada en Oracle , [18] SQL Server , [19] PostgreSQL , [20] SQLite [21] y MySQL . [22] La función COALESCE devuelve el primer argumento que no es nulo. Si todos los términos son nulos, devuelve nulos.
COALESCE ( posiblemente_null_value [, posiblemente_null_value , ... ]);
Rápido
En Swift , el operador coalescente nulo es ??
. Se utiliza para proporcionar un valor predeterminado al desenvolver un tipo opcional :
OptionalValue ?? valueIfNil
Por ejemplo, si uno desea implementar algún código Swift para darle a una página un título predeterminado si no hay ninguno, puede usar la siguiente declaración:
var suministrado Título : Cadena ? = ... var pageTitle : Cadena = suppliedTitle ?? "Título predeterminado"
en lugar del más detallado
var pageTitle : Cadena = ( suppliedTitle =! nil ) ? SuppliedTitle ! : "Título predeterminado" ;
VB.NET
En VB.NET, el operador / palabra clave If
[23] logra el efecto de operador coalescente nulo.
Dim pageTitle = Si ( título proporcionado , "Título predeterminado" )
que es una forma más concisa de usar su variación
Dim pageTitle = If ( proporcionadoTitulo <> Nada , proporcionadoTitle , "Título predeterminado" )
Ver también
- ?: ( condicional )
- Operador de Elvis (¿binario? :)
- Operador (programación)
Referencias
- ^ BillWagner. "?? Operador (Referencia de C #)" . msdn.microsoft.com .
- ^ a b "PowerShell 7 Preview 5" . PowerShell . 2019-10-23 . Consultado el 15 de febrero de 2020 .
- ^ "perlop - perldoc.perl.org" . perldoc.perl.org .
- ^ "El lenguaje de programación Swift (Swift 4): operadores básicos" . developer.apple.com .
- ^ "PHP: Archivo de noticias - 2015" . php.net .
- ^ "Página de manual de Bash" .
- ^ "Operador de Elvis" . wikidocs.adobe.com .
- ^ "[RAILO-2195] agrega soporte para Elvis Operator - JBoss Issue Tracker" . issues.jboss.org .
- ^ cartermp. "Valores nulos (F #)" . msdn.microsoft.com .
- ^ cartermp. "Sobrecarga del operador (F #)" . msdn.microsoft.com .
- ^ "Expresiones" . Apache FreeMarker Manual .
- ^ "Hackage" . Consultado el 10 de julio de 2015 .
- ^ "Especificación del idioma ECMAScript 2020" . Ecma International . Junio de 2020.
- ^ "Seguridad nula" ..
- ^ "PHP: rfc: isset_ternary" . Consultado el 16 de diciembre de 2014 .
- ^ Kocak, Midori. "PHP RFC: Operador de asignación de coalescencia nula" . PHP.net . Consultado el 20 de julio de 2017 .
- ^ https://www.python.org/dev/peps/pep-0505/
- ^ "Referencia del lenguaje SQL de la base de datos" . docs.oracle.com .
- ^ "COALESCE (SQL Server Compact)" . technet.microsoft.com .
- ^ "PostgreSQL: Documentación: 9.1: Expresiones condicionales" . www.postgresql.org .
- ^ "Lenguaje de consulta SQLite: funciones principales" . www.sqlite.org .
- ^ "MySQL :: MySQL 5.5 Reference Manual :: 12.3.2 Funciones y operadores de comparación" . dev.mysql.com .
- ^ dotnet-bot. "Si el operador (Visual Basic)" . docs.microsoft.com .