stringtranslate.com

Operador coalescente nulo

El operador coalescente nulo es un operador binario que forma parte de la sintaxis de una expresión condicional básica en varios lenguajes de programación , como (en orden alfabético): C# [1] desde la versión 2.0, [2] Dart [3] desde la versión 1.12 .0, [4] PHP desde la versión 7.0.0, [5] Perl desde la versión 5.10 como lógico definido-o , [6] PowerShell desde 7.0.0, [7] y Swift [8] como operador de fusión nula .

Si bien su comportamiento difiere entre implementaciones, el operador coalescente nulo generalmente devuelve el resultado de su operando más a la izquierda si existe y no es null y, en caso contrario, devuelve el operando más a la derecha. Este comportamiento permite definir un valor predeterminado para los casos en los que no hay disponible un valor más específico.

A diferencia del operador condicional ternario if usado como x ? x : y, pero al igual que 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 xtiene efectos secundarios .

Ejemplos por idiomas

Conchas tipo Bourne

En Bourne Shell (y derivados), "Si el parámetro no está establecido o es nulo, se sustituye la expansión de la palabra . De lo contrario, se sustituye el valor del parámetro ": [9]

#supplied_title='título suministrado' # Descomentar esta línea para usar el título proporcionado title = ${ Supply_title :- 'Título predeterminado' } echo " $title " # imprime: Título predeterminado  

C#

En C# , el operador coalescente nulo es ??.

Se utiliza con mayor frecuencia para simplificar expresiones de la siguiente manera:

posiblementeNullValue ?? valorSiNulo  

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 presente, puede usar la siguiente declaración:

cadena título de página = título suministrado ?? "Título predeterminado" ;     

en lugar de lo más detallado

cadena título de la página = ( título suministrado ! = nulo ) ? Título suministrado : "Título predeterminado" ;         

o

título de página de cadena ; if ( título suministrado ! = nulo ) { título de la página = título suministrado ; } else { pageTitle = "Título predeterminado" ; }         

Las tres formas dan como resultado que se almacene el mismo valor en la variable denominada pageTitle.

suppliedTitlese hace referencia solo una vez cuando se utiliza 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:

devolver algún_valor ?? algún_Valor2 ?? algún_Valor3 ;     

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 utilizar el operador de asignación coalescente nulo:

algún_Valor ??= algún_Valor2 ;  

Cuál es una versión más concisa de:

algún_Valor = algún_Valor ?? algún_Valor2 ;    

En combinación con el operador condicional nulo ?. o el operador de acceso a elemento condicional nulo, ?[]el operador coalescente nulo se puede utilizar para proporcionar un valor predeterminado si un objeto o miembro de un objeto es nulo. Por ejemplo, lo siguiente devolverá el título predeterminado si el pageobjeto es nulo o pageno lo es pero su Titlepropiedad es:

cadena título de página = página ?. Título ?? "Título predeterminado" ;     

CFML

A partir de ColdFusion 11, [10] Railo 4.1, [11] CFML admite el operador coalescente nulo como una variación del operador ternario ?:. Es funcional y sintácticamente equivalente a su contraparte de C#, arriba. Ejemplo:

posiblementeNullValue?: valorIfNull

F#

El valor nulo normalmente no se usa en F# para valores o variables. [12] Sin embargo, pueden aparecer valores nulos, por ejemplo, cuando se llama al código F# desde C#.

F# no tiene un operador coalescente nulo incorporado, pero se puede definir uno según sea necesario como operador personalizado: [13]

let (|?) lhs rhs = ( si lhs = nulo entonces rhs en caso contrario lhs )            

Este operador personalizado luego se puede aplicar según el operador de fusión nulo integrado de C#:

let título de página = título suministrado |? "Título predeterminado"     

marcador libre

Los valores faltantes en Apache FreeMarker normalmente provocarán excepciones. Sin embargo, se pueden manejar tanto los valores faltantes como los nulos, con un valor predeterminado opcional: [14]

${ variable faltante ! "valor por defecto" }

o, para dejar el resultado en blanco:

${ variable faltante ! }

Haskell

En general , los tipos en Haskell no pueden ser nulos. La representación de cálculos que pueden o no devolver un resultado significativo se representa mediante el tipo genérico Maybe, definido en la biblioteca estándar [15] como

datos Quizás a = Nada | Sólo un       

El operador coalescente nulo reemplaza los punteros nulos con un valor predeterminado. El equivalente de Haskell es una forma de extraer un valor de Maybe proporcionando un valor predeterminado. Esta es la función de Maybe.

fromMaybe :: a -> Quizás a -> a fromMaybe defaultValue x = caso x de Nada -> defaultValue Solo valor -> valor                    

A continuación se muestran algunos ejemplos de uso.

fromMaybe 0 ( Solo 3 ) - devuelve 3 fromMaybe "" Nada - devuelve ""       

javascript

El operador más cercano a JavaScript es ??, el "operador coalescente nulo", que se agregó al estándar en la undécima edición de ECMAScript . [16] En versiones anteriores, se podía utilizar 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" ( nullo 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, ase le asignará el valor de bsi el valor de bno es nullo undefined, en caso contrario se le asignará 3.

constante a = b ?? 3 ;     

Antes del operador coalescente nulo, los programadores usarían el operador lógico OR ( ||). Pero donde ??busca específicamente nullo undefined, el ||operador busca cualquier valor falsonull : , undefined, "", 0, NaNy por supuesto, false.

En el siguiente ejemplo, ase le asignará el valor de bsi el valor de bes verdadero , de lo contrario se le asignará 3.

constante a = b || 3 ;     

Kotlin

Kotlin usa el ?:operador. [17] Esta es una elección inusual de símbolo, dado que ?:se usa típicamente para el operador de Elvis , no la fusión nula, pero se inspiró en Groovy (lenguaje de programación) donde nulo se considera falso.

val título = título suministrado ?: "Título predeterminado"     

C objetivo

En Obj-C , el operador coalescente nulo es ?:. Se puede utilizar para proporcionar un valor predeterminado para referencias nulas:

valor de identificación = valorThatMightBeNil ?: valorIfNil ;     

Esto es lo mismo que escribir.

valor de identificación = valorThatMightBeNil ? valorThatMightBeNil : valorIfNil ;       

perla

En Perl (a partir de la versión 5.10), el operador es //y el código Perl equivalente es:

$posiblemente_valor_null // $valor_si_null  

El valor_null_posiblemente se evalúa como nulo o no nulo (en terminología Perl, indefinido o definido ). Según la evaluación, la expresión devuelve valor_si_null cuando posiblemente_valor_null es nulo, o posiblemente_valor_null en caso contrario. En ausencia de efectos secundarios, esto es similar a la forma en que funcionan los operadores ternarios ( ?:declaraciones) en los lenguajes que los admiten. El código Perl anterior es equivalente al uso del operador ternario siguiente:

¿ definido ( $ posiblemente_null_value ) ? $posiblemente_null_value : $value_if_null    

El uso más común de este operador es minimizar la cantidad de código utilizado para una verificación nula simple.

Perl además tiene un //=operador de asignación, donde

$a // = $b  

es en gran medida equivalente a:

$a = $a // $b    

||Este operador se diferencia de los operadores anteriores y 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 están 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.0 introdujo [18] un operador de fusión nula con la ??sintaxis. Esto comprueba estrictamente si hay NULL o una variable/índice de matriz/propiedad inexistente. En este sentido, actúa de manera similar a la isset()pseudofunció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  =  $this -> getUser ()  ??  $esto -> crearGuestUser ();/* Equivalente a */$usuario  =  $this -> getUser ();if  ( $usuario  ===  null )  {  $usuario  =  $this -> createGuestUser (); }
$títulodepágina  =  $título  ??  'Título predeterminado' ;/* Equivalente a */$títulodepágina  =  isset ( $título )  ?  $título  :  'Título predeterminado' ;

La versión 7.4 de PHP agregará el operador de asignación coalescente nula con la ??=sintaxis: [19]

// 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 utiliza el operador de fusión igual $this -> request -> data [ 'comments' ][ 'user_id' ]  ??=  'value' ;

Pitón

Python no tiene un operador coalescente nulo. Su funcionalidad se puede imitar mediante una expresión condicional:

ahora ()  si  el tiempo  es  Ninguno  más  tiempo

Hubo una propuesta para agregar operadores de tipo coalescente nulo en Python 3.8, pero esa propuesta se pospuso. [20]

Funcionalidad relacionada

El operador de Python orproporciona un comportamiento relacionado, pero diferente. La diferencia es que ortambién devuelve el término de la derecha si el primer término está definido, pero tiene un valor que se evalúa Falseen un contexto booleano:

42  o  "algo"  # devuelve 42 0  o  "algo"  # devuelve "algo" Falso  o  "algo"  # devuelve "algo" ""  o  "algo"  # devuelve "algo" []  o  "algo"  # devuelve "algo" dict ()  o  "algo"  # devuelve "algo" Ninguno  o  "algo"  # devuelve "algo"

Un operador coalescente nulo verdadero solo regresaría "something"en el último caso y devolvería los valores falsos ( 0,,,,, ) en Falselos otros ejemplos.""[]dict()

Potencia Shell

Desde PowerShell 7, el ??operador coalescente nulo proporciona esta funcionalidad. [7]

$miVar  =  $nulo $x  =  $miVar  ??  "algo"  # asigna "algo"

R

Dado que el operador R versión 4.4.0 %||%está incluido en la base R (anteriormente era una característica de algunos paquetes como rlang ).

Rubí

Ruby no tiene un operador coalescente nulo, pero sus operadores ||y ||=funcionan de la misma manera excepto en booleanos. Los condicionales de Ruby tienen solo dos valores falsos: falsey nil(donde 'falso' no es lo mismo que 0). El operador de Ruby ||evalúa su primer operando cuando es verdadero. En comparación, Perl/Python/Javascript, que también tienen la última propiedad, tienen otros valores similares a falsos (0 y una cadena vacía), que los diferencian ||de un operador coalescente nulo en muchos más casos (los números y las cadenas son dos de los tipos de datos más utilizados). Esto es lo que llevó a Perl/Python/Javascript a agregar un operador separado mientras que Ruby no lo hizo.

Óxido

Si bien no existe nullen Rust , las uniones etiquetadas se utilizan para el mismo propósito. Por ejemplo, Result<T, E>o Option<T>. Cualquier tipo que implemente el rasgo Try se puede desenvolver.

unwrap_or()tiene un propósito similar al del operador coalescente nulo en otros idiomas. Alternativamente, unwrap_or_else()se puede utilizar para utilizar el resultado de una función como valor predeterminado.

// Opción // Una opción puede ser Alguna(valor) o Ninguna Alguna ( 1 ). desenvolver_o ( 0 ); // se evalúa como 1 Ninguno . desenvolver_o ( 0 ); // se evalúa como 0 Ninguno . desenvolver_o_else ( get_default ); // evalúa el resultado de llamar a la función get_default   // Resultado // Un resultado puede ser Ok(valor) o Err(error) Ok ( 1 ). desenvolver_o ( 0 ); // se evalúa como 1 Err ( "oh no" ). desenvolver_o ( 1 ); // se evalúa a 1  

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_valor_null , 'valor si es nulo' ); 

Se debe tener cuidado de no confundir ISNULL con IS NULL ; este último sirve para evaluar si algunos contenidos están definidos como NULL o no.

El estándar ANSI SQL-92 incluye la función COALESCE implementada en Oracle , [21] SQL Server , [22] PostgreSQL , [23] SQLite [24] y MySQL . [25] La función COALESCE devuelve el primer argumento que no es nulo. Si todos los términos son nulos, devuelve nulo.

COALESCE ( posiblemente_valor_null [, posiblemente_valor_null , ... ]);  

La diferencia entre ISNULL y COALESCE es que el tipo devuelto por ISNULL es el tipo del valor más a la izquierda, mientras que COALESCE devuelve el tipo del primer valor no nulo.

Rápido

En Swift , el operador coalescente nulo es ??. Se utiliza para proporcionar un valor predeterminado al desenvolver un tipo opcional :

valor opcional  ??  valorSiNil

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 presente, puede usar la siguiente declaración:

var  título suministrado :  cadena ?  =  ... var  títulodepágina :  Cadena  =  título suministrado  ??  "Título predeterminado"

en lugar de lo más detallado

var  título de página :  Cadena  =  ( título suministrado  ! =  nulo )  ?  Título suministrado !  :  "Título predeterminado" ;

VB.NET

En VB.NET, el operador/palabra clave If[26] logra el efecto de operador coalescente nulo.

Dim pageTitle = If ( título suministrado , "Título predeterminado" )    

que es una forma más concisa de utilizar su variación

Dim pageTitle = If ( título suministrado <> Nada , título suministrado , "Título predeterminado" )       

Ver también

Referencias

  1. ^ "?? y ??= operadores: los operadores de fusión nula". aprender.microsoft.com .
  2. ^ "ECMA-334, 3.ª edición, junio de 2005" (PDF) . ecma-international.org . ECMA Internacional . Junio ​​de 2005. p. 63.
  3. ^ "Expresión condicional".
  4. ^ "Registro de cambios del SDK de Dart, 1.12.0". github.com . 2015-08-31.
  5. ^ "PHP: Archivo de noticias - 2015". php.net .
  6. ^ "perlop-perldoc.perl.org". perldoc.perl.org .
  7. ^ ab "Vista previa 5 de PowerShell 7". Potencia Shell . 2019-10-23 . Consultado el 15 de febrero de 2020 .
  8. ^ "El lenguaje de programación Swift (Swift 5): operadores básicos: operador de fusión nula". docs.swift.org .
  9. ^ "Página de manual de Bash".
  10. ^ "Operador de Elvis". wikidocs.adobe.com .
  11. ^ "[RAILO-2195] agrega soporte para el operador de Elvis". Rastreador de problemas de JBoss .
  12. ^ cartermp. "Valores nulos (F#)". msdn.microsoft.com .
  13. ^ cartermp. "Sobrecarga del operador (F#)". msdn.microsoft.com .
  14. ^ "Expresiones". Manual de Apache FreeMarker .
  15. ^ "Hackear" . Consultado el 10 de julio de 2015 .
  16. ^ "Especificación del lenguaje ECMAScript 2020". ECMA Internacional . Junio ​​de 2020.
  17. ^ "Seguridad nula"..
  18. ^ "PHP: rfc:isset_ternary" . Consultado el 16 de diciembre de 2014 .
  19. ^ Kocak, Midori. "PHP RFC: Operador de asignación coalescente nula". PHP.net . Consultado el 20 de julio de 2017 .
  20. ^ "PEP 505: operadores que no lo reconocen".
  21. ^ "Referencia del lenguaje SQL de base de datos". docs.oracle.com .
  22. ^ "COALESCE (SQL Server Compact)". technet.microsoft.com .
  23. ^ "PostgreSQL: Documentación: 9.1: Expresiones condicionales". www.postgresql.org . 27 de octubre de 2016.
  24. ^ "Lenguaje de consulta SQLite: funciones principales". www.sqlite.org .
  25. ^ "MySQL :: Manual de referencia de MySQL 5.5 :: 12.3.2 Operadores y funciones de comparación". dev.mysql.com .
  26. ^ dotnet-bot. "Si Operador (Visual Basic)". docs.microsoft.com .