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