Null -Koalescing -Operator

Das Null -Koalescing -Operator (genannt Logisch definierter oder Operator in Perl) ist ein Binärbetreiber Das ist Teil der Syntax für eine Basis bedingter Ausdruck in verschiedenen Programmiersprachen, einschließlich C#,[1] Power Shell Ab Version 7.0.0,[2] Perl Ab Version 5.10,[3] Schnell,[4] und Php 7.0.0.[5] Während sein Verhalten zwischen den Implementierungen unterschiedlich ist, gibt der Null-Koalescing-Operator im Allgemeinen das Ergebnis seines linken Operanden zurück, wenn er existiert und nicht ist Nullund gibt ansonsten den rechtsmächsten Operanden zurück. Mit diesem Verhalten kann ein Standardwert für Fälle definiert werden, in denen kein spezifischerer Wert verfügbar ist.

Im Gegensatz zum ternären Bedingung, wenn Bediener verwendet als x ? x: y, aber wie das Binär Elvis -Betreiber benutzt als x?: yDer Null -Koalescing -Operator ist ein Binäroperator und bewertet somit seine Operanden höchstens einmal, was bei der Bewertung von signifikant ist x hat Nebenwirkungen.

Beispiele von Sprachen

Bourne-ähnliche Muscheln

Im Bourne Shell (und Derivate), "wenn Parameter ist unbegründet oder null, die Ausdehnung von Wort ist ersetzt. Ansonsten der Wert von Parameter ist ersetzt ":[6]

# Supplied_title = 'Lieferungstitel' # In Übereinstimmung dieser Zeile, um den angegebenen Titel zu verwenden Titel=$ {geliefert_title:-'Standardtitel'} Echo "$ titel" # Drucke: Standardtitel 

C#

Im C#Der Null -Koalescing -Operator ist ?.

Es wird am häufigsten verwendet, um die Ausdrücke wie folgt zu vereinfachen:

Möglicherweise nullValue ? Valueifnull 

Wenn man beispielsweise einen C# Code implementieren möchte, um einer Seite einen Standardtitel zu geben, wenn keine vorhanden ist, kann die folgende Anweisung verwendet werden:

Saite Seitentitel = übertragen ? "Standardtitel"; 

statt der ausführlicheren

Saite Seitentitel = (übertragen ! = Null) ? übertragen : "Standardtitel"; 

oder

Saite Seitentitel; wenn (übertragen ! = Null) {  Seitentitel = übertragen; } anders {  Seitentitel = "Standardtitel"; } 

Die drei Formen führen dazu, dass der gleiche Wert in die benannte Variable gespeichert wird Seitentitel.

Beachten Sie, dass übertragen Es wird nur einmal verwiesen, wenn Sie die verwenden ? Operator und zweimal in den beiden anderen Code -Beispielen.

Der Bediener kann auch im selben Ausdruck mehrfach verwendet werden:

Rückkehr SONDER_VALUE ? SONDER_VALUE2 ? SONDER_VALUE3; 

Sobald ein nicht-null-Wert der Anzahl zugeordnet ist oder er den Endwert erreicht (der möglicherweise nicht null ist), ist der Ausdruck abgeschlossen.

Wenn beispielsweise eine Variable in einen anderen Wert geändert werden sollte, wenn ihr Wert auf NULL bewertet, da C# 8.0 die ?? = Null -Koalescing -Zuweisungsoperator kann verwendet werden:

SONDER_VALUE ?? = SONDER_VALUE2; 

Das ist eine prägnantere Version von:

SONDER_VALUE = SONDER_VALUE ? SONDER_VALUE2; 

In Kombination mit dem NULL-Conditional Operator ?. oder der Null-Conditional-Element-Zugriffsbetreiber ? [] Der Null -Koalescing -Operator kann verwendet werden, um einen Standardwert zu liefern, wenn ein Objekt oder ein Objekt eines Objekts null ist. Zum Beispiel gibt der folgende den Standardtitel zurück, wenn entweder der Seite Objekt ist null oder Seite ist nicht null, sondern es Titel Eigenschaft ist:

Saite Seitentitel = Seite?.Titel ? "Standardtitel"; 

Cfml

Ab Coldfusion 11,[7] Railo 4.1,[8] Cfml Unterstützt den Null -Koalescing -Operator als eine Variation des ternären Operators, ?:. Es ist funktionell und syntaktisch mit seinem C# -Gegenstück äquivalent. Beispiel:

möglicherweise nullValue?: valueifnull


F#

Der Nullwert wird normalerweise nicht in verwendet F# Für Werte oder Variablen.[9] Nullwerte können beispielsweise angezeigt werden, wenn F# Code von C# aufgerufen wird.

F# hat keinen integrierten Null-Koalescing-Operator, aber man kann als Bedarf als benutzerdefinierter Operator definiert werden:[10]

Lassen (|?) lhs RHS = (wenn lhs = Null dann RHS anders lhs) 

Dieser benutzerdefinierte Bediener kann dann gemäß dem integrierten Null-Koalescing-Operator von C#angewendet werden:

Lassen Seitentitel = übertragen |? "Standardtitel" 

Freimaurer

Fehlende Werte in Apache Freemarker wird normalerweise Ausnahmen verursachen. Fehlende und Nullwerte können jedoch mit einem optionalen Standardwert behandelt werden:[11]

$ {vermisstvariable!"Standardwert"} 

Oder um die Ausgabe leer zu lassen:

$ {vermisstvariable!} 

Haskell

Typen Haskell kann im Allgemeinen nicht null sein. Darstellung von Berechnungen, die ein aussagekräftiges Ergebnis zurückgeben oder nicht, wird durch den Generikumstyp dargestellt, der in der Standardbibliothek definiert ist[12] wie

Daten Vielleicht a = Nichts | Gerade a 

Der Null -Koalescing -Operator ersetzt Nullzeiger mit einem Standardwert. Das Haskell -Äquivalent ist eine Möglichkeit, einen Wert aus einem möglicherweise durch die Lieferung eines Standardwerts zu extrahieren. Dies ist die Funktion Fromaybe.

Fromaybe :: a -> Vielleicht a -> a Fromaybe Standardwert x =  Fall x von  Nichts -> Standardwert  Gerade Wert -> Wert 

Es folgt ein Beispiel für die Verwendung.

Fromaybe 0 (Gerade 3) - Rückkehr 3 Fromaybe "" " Nichts -- kehrt zurück "" 

JavaScript

JavaScriptDer nächste Operator ist ?, der "Nullish Coalescing -Operator", der zum Standard in hinzugefügt wurde ECMaskript11. Ausgabe.[13] In früheren Versionen könnte es über a verwendet werden Babel Plugin und in Typoskript. Es bewertet seinen linken Operanden und, wenn der Ergebniswert ist nicht "nullisch" (Null oder nicht definiert), nimmt diesen Wert als Ergebnis; Andernfalls bewertet es den rechten Operanden und nimmt den resultierenden Wert als Ergebnis.

Im folgenden Beispiel, a wird den Wert von zugewiesen b Wenn der Wert von b ist nicht Null oder nicht definiertsonst wird es zugewiesen 3.

Const a = b ? 3; 

Vor dem Nullish -Koalescing -Operator würden Programmierer den logischen oder Operator verwenden (Operator (||). Aber wo ? Sieht speziell für Null oder nicht definiert, das || Bediener sucht nach allen falsy Wert: Null, nicht definiert, "" ", 0, Nan, und natürlich, FALSCH.

Im folgenden Beispiel, a wird den Wert von zugewiesen b Wenn der Wert von b ist Wahrheitsonst wird es zugewiesen 3.

Const a = b || 3; 

Kotlin

Kotlin verwendet die ?: Operator.[14] Dies ist eine ungewöhnliche Wahl des Symbols, wenn man das ist ?: wird normalerweise für die verwendet Elvis -Betreiber, nicht null calescing, aber es wurde von inspiriert von Groovy (Programmiersprache) wo Null als falsch angesehen wird.

val Titel = übertragen ?: "Standardtitel" 

Ziel c

Im OBJ-CDer Nil -Koalescing -Operator ist ?:. Es kann verwendet werden, um einen Standard für keine Referenzen bereitzustellen:

Ich würde Wert = ValuethatMightBenil ?: Valueifnil; 

Dies ist das gleiche wie das Schreiben

Ich würde Wert = ValuethatMightBenil ? ValuethatMightBenil : Valueifnil; 

Perl

Im Perl (Beginnend mit Version 5.10) ist der Bediener // und der äquivalente Perlcode lautet:

$ möglicherweise_null_value // $ value_if_null 

Das Möglicherweise_null_value wird bewertet als Null oder nicht null (in Perl -Terminologie, nicht definiert oder definiert). Auf der Grundlage der Bewertung kehrt der Ausdruck entweder zurück value_if_null Wenn Möglicherweise_null_value ist null, oder Möglicherweise_null_value Andernfalls. In Abwesenheit von Nebenwirkungen Dies ähnelt dem Weg ternäre Operatoren (?: Aussagen) Arbeiten in Sprachen, die sie unterstützen. Der obige Perl -Code entspricht der Verwendung des folgenden ternären Operators:

definiert($ möglicherweise_null_value) ? $ möglicherweise_null_value : $ value_if_null 

Die häufigste Verwendung dieses Bedieners besteht darin, die Menge an Code zu minimieren, die für eine einfache Nullprüfung verwendet wird.

Perl hat zusätzlich a // = Zuordnungsbetreiber, wo

$ a //= $ b 

ist weitgehend gleichbedeutend mit:

$ a = $ a // $ b 

Dieser Bediener unterscheidet sich von Perls älter || und || = Betreiber insofern berücksichtigt Definition, nicht Wahrheit. Somit verhalten sie sich unterschiedlich bei Werten, die falsch, aber definiert sind, z. B. 0 oder '' (eine String mit Zero-Länge):

$ a = 0; $ b = 1; $ c = $ a // $ b;  # $ C = 0 $ c = $ a || $ b;  # $ C = 1 

Php

PHP 7 hat eingeführt[15] ein Null-Koalescing-Operator mit dem ? Syntax. Dies prüft ausschließlich auf NULL oder eine nicht existierende Variable/Array-Index/eine Eigenschaft. In dieser Hinsicht wirkt es ähnlich wie PHPs isset () Pseudo-Funktion:

$ name = $ Anfrage->Eingang['Name'] ? $ Anfrage->Anfrage['Name'] ? "Standardname"; /* Gleichwertig */ wenn (Ausgabe($ Anfrage->Eingang['Name']))) {  $ name = $ Anfrage->Eingang['Name']; } elseif (Ausgabe($ Anfrage->Anfrage['Name']))) {  $ name = $ Anfrage->Anfrage['Name']; } anders {  $ name = "Standardname"; } 
$ Benutzer = $ das->Getuser() ? $ das->CreateGuestuser(); /* Gleichwertig */ $ Benutzer = $ das->Getuser(); wenn (Null === $ Benutzer) {  $ Benutzer = $ das->CreateGuestuser(); } 
$ pagetitle = $ titel ? 'Standardtitel'; /* Gleichwertig */ $ pagetitle = Ausgabe($ titel) ? $ titel : 'Standardtitel'; 

Version 7.4 von PHP fügt den Null -Koalescing -Zuweisungsoperator mit dem hinzu ?? = Syntax:[16]

// Die folgenden Zeilen tun dasselbe $ das->Anfrage->Daten['Kommentare']['Benutzeridentifikation'] = $ das->Anfrage->Daten['Kommentare']['Benutzeridentifikation'] ? 'Wert'; // Anstatt Variablen mit langen Namen zu wiederholen, wird der gleiche Koalesce -Operator verwendet $ das->Anfrage->Daten['Kommentare']['Benutzeridentifikation'] ?? = 'Wert'; 

Python

Python tut es nicht einen Null -Koalescing -Operator haben. Seine Funktionalität kann unter Verwendung eines bedingten Ausdrucks nachgeahmt werden:

jetzt() wenn Zeit ist Keiner anders Zeit 

Es gab einen Vorschlag, in Python 3.8 Operatoren vom Typ Null-Koalescing hinzuzufügen, aber dieser Vorschlag wurde verschoben.[17]

Verwandte Funktionalität

Python or Der Bediener bietet ein verwandtes, aber unterschiedliches Verhalten. Der Unterschied ist das or Gibt auch den rechten Term zurück, wenn der erste Term definiert ist, hat jedoch einen Wert, der bewertet wird False In einem booleschen Kontext:

42  oder "etwas"  # gibt 42 zurück 0  oder "etwas"  # Gibt "etwas" zurück " FALSCH  oder "etwas"  # Gibt "etwas" zurück " "" "  oder "etwas"  # Gibt "etwas" zurück " []  oder "etwas"  # Gibt "etwas" zurück " DICT() oder "etwas"  # Gibt "etwas" zurück " Keiner  oder "etwas"  # Gibt "etwas" zurück " 

Ein echter Null -Koalescing -Operator würde nur zurückkehren "something" im allerletzten Fall und würde die falschen Werte zurückgeben (0, False, "", [], dict()) In den anderen Beispielen.

Power Shell

Seit Powershell 7 die ? Der Null -Koalescing -Operator liefert diese Funktionalität.[2]

$ myvar = $ null $ x = $ myvar ? "etwas" # weist "etwas" zu 

Rost

Während es keine gibt Null in Rost, Markierte Gewerkschaften werden für den gleichen Zweck verwendet. Zum Beispiel, Ergebnis oder Möglichkeit.

ewrap_or_else () dient einen ähnlichen Zweck wie der Null -Koalescing -Operator in anderen Sprachen. Wenn die Berechnung des Standardwerts keine Nebenwirkungen hat, hat ewrap_or () kann als prägnanter (und ohne Optimierungen effizienter) Wahl verwendet werden.

Lassen Parsed_numbers: Vec<_> = ["1", "Nicht eine Nummer", "3"]   .Iter()   .Karte(|n| n.analysieren().ewrap_or_else(|_| std::i64::MINDEST))   .sammeln(); // Drucke "[1, -9223372036854775808, 3]" println!("{:?}", Parsed_numbers); 

Sql

In Oracle PL/sql, das NVL() Funktion liefert das gleiche Ergebnis:

NVL(Möglicherweise_null_value, 'Wert wenn null'); 

Im SQL Server/Transact-SQL Es gibt die ISNull -Funktion, die demselben Prototypmuster folgt:

IST NULL(Möglicherweise_null_value, 'Wert wenn null'); 

Es sollte darauf geachtet werden, nicht zu verwirren IST NULL mit IST NULL - Letzteres dient dazu, zu bewerten, ob einige Inhalte definiert sind NULL oder nicht.

Der ANSI SQL-92-Standard enthält die Koalesce-Funktion, die in implementiert ist Orakel,[18] SQL Server,[19] PostgreSQL,[20] Sqlite[21] und Mysql.[22] Die Koalesce -Funktion gibt das erste Argument zurück, das nicht null ist. Wenn alle Begriffe null sind, gibt NULL zurück.

VERSCHMELZEN(Möglicherweise_null_value[, Möglicherweise_null_value, ...]); 

Schnell

Im SchnellDer Nil -Koalescing -Operator ist ?. Es wird verwendet, um ein Standard zu liefern Optionaler Typ:

OptionalValue ? Valueifnil 

Wenn man beispielsweise einen Swift -Code implementieren möchte, um einer Seite einen Standardtitel zu geben, wenn keine vorhanden ist, kann die folgende Anweisung verwendet werden:

var übertragen: Saite? = ... var Seitentitel: Saite = übertragen ? "Standardtitel" 

statt der ausführlicheren

var Seitentitel: Saite = (übertragen ! = Null) ? übertragen! : "Standardtitel"; 

Vb.net

Im Vb.net das Wenn[23] Operator/Keyword erreicht den Null -Koalescing -Operator -Effekt.

Schwach Seitentitel = Wenn(übertragen, "Standardtitel") 

Dies ist eine prägnantere Methode, um seine Variation zu verwenden

Schwach Seitentitel = Wenn(übertragen <> Nichts, übertragen, "Standardtitel") 

Siehe auch

Verweise

  1. ^ Billwagner. "?? Operator (C# Referenz)". msdn.microsoft.com.
  2. ^ a b "PowerShell 7 Preview 5". Power Shell. 2019-10-23. Abgerufen 2020-02-15.
  3. ^ "Perlop - perldoc.perl.org". perldoc.perl.org.
  4. ^ "Die Swift -Programmiersprache (Swift 4): Basic -Operatoren". Entwickler.apple.com.
  5. ^ "PHP: Nachrichtenarchiv - 2015". php.net.
  6. ^ "Bash Man Page".
  7. ^ "Elvis -Betreiber". wikidocs.adobe.com.
  8. ^ "[Railo -2195] Fügen Sie Unterstützung für den Elvis -Betreiber - JBOSS EIG eines Tracker hinzu".. issue.jboss.org.
  9. ^ Cartermp. "NULL -Werte (F#)". msdn.microsoft.com.
  10. ^ Cartermp. "Operator Overloading (F#)". msdn.microsoft.com.
  11. ^ "Ausdrücke". Apache Freemarker Handbuch.
  12. ^ "Hackage". Abgerufen 10. Juli 2015.
  13. ^ "ECMascript 2020 Sprachspezifikation". ECMA International. Juni 2020.
  14. ^ "Nullsicherheit"..
  15. ^ "PHP: RFC: isset_ternary". Abgerufen 16. Dezember 2014.
  16. ^ Kocak, Midori. "PHP RFC: Null -Koalescing -Zuweisungsoperator". Php.net. Abgerufen 20. Juli 2017.
  17. ^ "Pep 505-Nicht bewusst" Betreiber ".
  18. ^ "Datenbank SQL Language Referenz". docs.oracle.com.
  19. ^ "Koalesce (SQL Server Compact)". technet.microsoft.com.
  20. ^ "PostgreSQL: Dokumentation: 9.1: Bedingte Ausdrücke". www.postgresql.org. 27. Oktober 2016.
  21. ^ "SQLite Query Language: Kernfunktionen". www.sqlite.org.
  22. ^ "MySQL :: Mysql 5.5 Referenzhandbuch :: 12.3.2 Vergleichsfunktionen und Bediener". dev.mysql.com.
  23. ^ Dotnet-Bot. "Wenn Operator (Visual Basic)". docs.microsoft.com.