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