Säker navigationsoperatör
I objektorienterad programmering är den säkra navigeringsoperatören (även känd som optional chaining operator , safe call operator , noll-conditional operator , noll-propagation operator ) en binär operatör som returnerar null om dess första argument är null; annars utför den en avledningsoperation enligt det andra argumentet (vanligtvis en objektmedlemsåtkomst, arrayindex eller lambda-anrop).
Den används för att undvika sekventiella explicita nollkontroller och tilldelningar och ersätta dem med metod/egenskapskedja. I programmeringsspråk där navigationsoperatören (t.ex. ".") leder till ett fel om den appliceras på ett nollobjekt, stoppar den säkra navigeringsoperatören utvärderingen av en metod/fältkedja och returnerar null som värdet på kedjeuttrycket. Det användes först av Groovy 1.0 2007 och stöds för närvarande i språk som C# , Swift , TypeScript , Ruby , Kotlin , Rust och andra. Det finns för närvarande ingen vanlig namnkonvention för denna operatör, men säker navigationsoperatör är den mest använda termen.
Den största fördelen med att använda denna operator är att den undviker undergångspyramiden . Istället för att skriva flera kapslade om
s kan programmerare bara använda vanlig kedja, men lägga till frågeteckensymboler före punkter (eller andra tecken som används för kedja).
Även om operatören för säker navigering och operatören för nollsammanslutning båda är nollmedvetna operatörer , är de operativt olika.
Exempel
Apex
Exempel på säker navigationsoperatör:
ett [ x ]? . aMetod (). aField // Utvärderas till null om a[x] == null a [ x ] . aMetod () ? . aField // returnerar null om a[x].aMethod() utvärderas till null String profileUrl = user . getProfileUrl () ? . toExternalForm (); returnera [ SELECT Name FROM Account WHERE Id = : accId ]? . Namn ;
C#
C# 6.0 och högre har ?.
, den nollvillkorade medlemsåtkomstoperatören (som även kallas Elvis-operatören av Microsoft och inte ska förväxlas med den allmänna användningen av termen Elvis-operatör , vars motsvarighet i C# är ??
, nollsammanslutningsoperatören ) och ?
[ ]
, den nollvillkorade elementåtkomstoperatören , som utför ett nollsäkert anrop av en indexerare get accessor . Om typen av resultatet av medlemsåtkomsten är en värdetyp , är typen av resultatet av en nollvillkorad åtkomst för den medlemmen en nullbar version av den värdetypen .
Följande exempel hämtar namnet på författaren till den första artikeln i en array av artiklar (förutsatt att varje artikel har en författaremedlem
och att varje författare har en Name
member), och resulterar i null
om arrayen är null
, om dess första element är null
, om författarens
medlem av artikeln är null
, eller om namnmedlemmen
för den författaren är null
. Observera att ett IndexOutOfRangeException
fortfarande kastas om arrayen inte är null men tom (dvs. nolllängd).
0 var namn = artiklar ?[ ]?. Författare ?. Namn ;
Att anropa en lambda kräver callback?.Invoke()
, eftersom det inte finns någon noll-villkorlig anrop ( callback?()
är inte tillåten).
var resultat = återuppringning ?. Anropa ( args );
Clojure
Clojure har inte sanna operatorer i den meningen att andra språk använder det, men eftersom det är interoperabelt med Java och måste utföra objektnavigering när det gör det, kan makrot some-> användas för att utföra säker
navigering.
( någon-> artikel .författare .namn )
CoffeeScript
Existentiell operatör:
zip = lotteri . dragningVinnare ? (). adress ? . postnummer
Kristall
Crystal stöder metoden testa
säker navigering
namn = artikel . prova &. författare . prova &. namn
Pil
Operatör för villkorad medlemsåtkomst:
var namn = artikel ? . författare ? . namn
Gosu
Null säker anropsoperatör:
var namn = artikel ?. författare ?. namn
Den nollsäkra anropsoperatorn behövs inte för klassattribut som deklareras som Gosu-egenskaper:
class Foo { var _bar : String as Bar } var foo : Foo = null // nedan kommer att utvärderas till null och inte returnera ett NullPointerException var bar = foo . Bar
Häftig
Säker navigationsoperatör och säker indexoperatör:
0 def namn = artikel ?. författare ?[ ]. namn
JavaScript
Tillagd i ECMAScript 2020 ger den valfria kedjeoperatorn ett sätt att förenkla åtkomst till värden genom anslutna objekt när det är möjligt att en referens eller funktion kan vara odefinierad eller null .
0
konstnamn = artikel ? _ . författare ? .[ ] ? . namn konst resultat = återuppringning ? .()
Den kortsluter hela anropskedjan på dess högra sida: i följande exempel är bar inte "åtkomst".
null ? . foo . bar
Kotlin
Säkerhetssamtalsoperatör:
val namn = artikel ?. författare ?. namn
Mål-C
Normal navigeringssyntax kan användas i de flesta fall utan att ta hänsyn till NULLs, eftersom de underliggande meddelandena, när de skickas till NULL, kasseras utan några negativa effekter.
0 NSString * namn = artikel . författare [ ]. namn ;
Perl 5
Perl 5 har inte den här typen av operatör, men ett förslag för inkludering accepterades med följande syntax:
mitt $namn = $artikel ? -> författare ? -> namn ;
PHP
Null safe-operatören accepterades för PHP 8:
$namn = $artikel ?-> författare ?-> namn ;
Pytonorm
Operatören för säker navigering stöds inte i Python. Det föreslogs för inkludering med följande syntax:
# Föreslagen syntax, ännu inte en del av språket: namn = artikel ? . författare ? . namn
Raku (Perl 6)
Säker metodanrop:
mitt $namn = $artikel .? författare .? namn ;
Rubin
Ruby stöder &.
säker navigationsoperatör (även känd som den ensamma operatören ) sedan version 2.3.0:
namn = artikel &. författare &. namn
Rost
Rost stöder ?
och prova!{}
-operatorer för strukturer som implementerar Try
-egenskapen.
// Den föredragna metoden för att snabbt returnera Errors fn write_to_file_question () -> Resultat < (), MyError > { let mut file = File :: create ( "my_best_friends.txt" ) ? ; fil . write_all ( b"Detta är en lista över mina bästa vänner." ) ? ; Ok (()) } // Den tidigare metoden för att snabbt returnera Errors fn write_to_file_using_try () -> Resultat < () , MyError > { let mut file = r # try ! ( File :: skapa ( "mina_bästa_vänner.txt")) ; r # försök ! ( fil . write_all ( b"Detta är en lista över mina bästa vänner." )) ; Ok (()) }
Scala
Den nollsäkra operatören i Scala tillhandahålls av biblioteket Dsl.scala.
valnamn = artikel . _ ? . författare . ? . namn : @ ?
Den @?
anteckning kan användas för att ange ett nullvärde.
fallklass Träd ( vänster : Träd @ ? = null , höger : Träd @ ? = null , värde : String @ ? = null ) val rot : Träd @ ? _ = Träd ( vänster = Träd ( vänster = Träd ( värde = "vänster-vänster" ), höger = Träd ( värde = "vänster-höger" ) ), höger = Träd ( värde = "höger" ) )
Det normala .
i Scala är inte null-säkert när man utför en metod på ett nollvärde
.
a [ NullPointerException ] bör thrownBy { root . _ rätt . vänster . rätt . värde // root.right.left är null! }
Undantaget kan undvikas genom att använda ?
operatorn på nullvärdet istället:
rot . ? . rätt . ? . vänster . ? . värdet ska vara ( null )
Hela uttrycket är null
om en av ?
utförs på ett nollvärde
.
Gränsen för en noll
säker operatör ?
är det närmaste omslutande uttrycket vars typ är kommenterad som @ ?
.
( "Hello" + ( "world" + root . ? . right . ? . left . ? . value )) ska vara ( "Hello world null") ( " Hej " + (( "world" + root . ? . right . ? . vänster . ? . värde . ? ): @ ? )) ska vara ( "Hello null" ) (( "Hej" + ( "världen" + rot . ? . höger . ? . vänster . ? . värde . ? )): @ ? ) ska vara ( null )
Snabb
Valfri kedjeoperatör, abonnemangsoperatör och samtal:
0
låt namn = artikel ?. författare ?[ ]. namn låt resultat = protokollVar ?. optionalRequirement ?()
TypeScript
Valfri kedjeoperatör inkluderades i Typescript 3.7-versionen:
0 låt x = foo ? . bar ? .[ ] ? . baz ();
Visual Basic .NET
Visual Basic 14 och högre har ?.
(den nollvillkorade medlemsåtkomstoperatören ) och ?()
(den nollvillkorade indexoperatorn ), liknande C#. De har samma beteende som motsvarande operatorer i C#.
Följande uttalande fungerar identiskt med C#-exemplet ovan.
0 Dim namn = artiklar ? ( ) ? . Författare ? . namn
Se även
externa länkar
- PEP 505 , diskuterar möjligheten av säkra navigeringsoperatörer för Python