Sikker navigasjonsoperatør - Safe navigation operator
I objektorientert programmering er operatøren for sikker navigasjon (også kjent som valgfri kjedeoperatør , sikker samtaleoperatør , nullbetinget operatør ) en binær operatør som returnerer null hvis det første argumentet er null; ellers utfører den en dereferenseringsoperasjon som spesifisert av det andre argumentet (vanligvis tilgang til objektmedlem, matrisindeks eller lambda -påkallelse).
Den brukes til å unngå sekvensielle eksplisitte nullkontroller og oppgaver og erstatte dem med metode/eiendomskjedning. I programmeringsspråk der navigasjonsoperatøren (f.eks. ".") Fører til en feil hvis den brukes på et nullobjekt, stopper den sikre navigasjonsoperatøren evalueringen av en metode/feltkjede og returnerer null som verdien av kjedeuttrykket. Den ble først brukt av Groovy 1.0 i 2007 og støttes for tiden på språk som C# , Swift , TypeScript , Ruby , Kotlin , Rust og andre. Det er for tiden ingen vanlig navnekonvensjon for denne operatøren, men sikker navigasjonsoperatør er det mest brukte uttrykket.
Den største fordelen med å bruke denne operatøren er at den unngår undergangspyramiden . I stedet for å skrive flere nestede ifs, kan programmerere bare bruke vanlig kjetting, men legge til spørsmålstegn før prikker (eller andre tegn som brukes for kjetting).
Selv om operatøren for sikker navigering og null-koalesceringsoperatør begge er null-bevisste operatører , er de operasjonelt forskjellige.
Eksempler
Toppunkt
Eksempler på sikre navigasjonsoperatører:
a[x]?.aMethod().aField // Evaluates to null if a[x] == null
a[x].aMethod()?.aField // returns null if a[x].aMethod() evaluates to null
String profileUrl = user.getProfileUrl()?.toExternalForm();
return [SELECT Name FROM Account WHERE Id = :accId]?.Name;
C#
C # 6.0 og ovenfor har ?.den null-betingede medlem tilgang operator (som også kalles Elvis operatøren av Microsoft og er ikke forveksles med den generelle bruk av begrepet Elvis operatør , som har tilsvarende i C # er ??den null koaleserende operator ) og ?[], null-betinget element-tilgangsoperatør , som utfører et null-sikkert anrop av en indekser får accessor . Hvis typen resultatet av medlem-tilgang er en verditype , type resultatet av en null-betinget tilgang fra medlemmet er et nullable versjon av det verditype .
Følgende eksempel henter navnet på forfatteren av den første artikkelen i en rekke artikler (forutsatt at hver artikkel har et Authormedlem og at hver forfatter har et Namemedlem), og resulterer i nullom matrisen er null, hvis det første elementet er null, hvis den Authormedlem av den artikkelen er null, eller hvis Namemedlem av denne forfatteren er null. Vær oppmerksom på at en IndexOutOfRangeExceptionfremdeles kastes hvis matrisen er ikke-null, men tom (dvs. null lengde).
var name = articles?[0]?.Author?.Name;
Å ringe en lambda krever callback?.Invoke(), ettersom det ikke er null-betinget påkallelse ( callback?()er ikke tillatt).
var result = callback?.Invoke(args);
Clojure
Clojure har ikke sanne operatører i den forstand at andre språk bruker det, men ettersom det samhandler med Java og må utføre objektnavigasjon når det gjør det, kan some->makroen brukes til å utføre sikker navigasjon.
(some-> article .author .name)
CoffeeScript
Eksistensiell operatør:
zip = lottery.drawWinner?().address?.zipcode
Krystall
Crystal støtter den trysikre navigasjonsmetoden
name = article.try &.author.try &.name
Dart
Betinget operatør for medlemstilgang:
var name = article?.author?.name
Gosu
Null sikker påkallelse operatør:
var name = article?.author?.name
Den null-sikre påkallingsoperatøren er ikke nødvendig for klasseattributter deklarert som Gosu Properties:
class Foo {
var _bar: String as Bar
}
var foo: Foo = null
// the below will evaluate to null and not return a NullPointerException
var bar = foo.Bar
Groovy
Sikker navigasjonsoperatør og sikker indeksoperatør:
def name = article?.authors?[0].name
JavaScript
Lagt til i ECMAScript 2020, gir den valgfrie kjedeoperatøren en måte å forenkle tilgang til verdier gjennom tilkoblede objekter når det er mulig at en referanse eller funksjon kan være udefinert eller null .
const name = article?.authors?.[0]?.name
const result = callback?.()
Den kortslutter hele samtalekjeden på høyre side: i det følgende eksemplet er ikke baren "tilgjengelig".
null?.foo.bar
Kotlin
Trygg samtaleoperatør:
val name = article?.author?.name
Mål-C
Normal navigasjonssyntaks kan i de fleste tilfeller brukes uten NULLer, ettersom de underliggende meldingene når de sendes til NULL, blir kastet uten noen negative effekter.
NSString *name = article.author[0].name;
PHP
Null safe -operatøren ble akseptert for PHP 8:
$name = $article?->author?->name;
Python
Operatøren for sikker navigasjon støttes ikke i Python. Det ble foreslått å inkluderes med følgende syntaks:
# Proposed syntax, not yet part of the language:
name = article?.author?.name
Raku (Perl 6)
Safe method call:
my $name = $article.?author.?name;
Rubin
Ruby støtter den &.sikre navigasjonsoperatøren (også kjent som den ensomme operatøren ) siden versjon 2.3.0:
name = article&.author&.name
Rust
Rust støtter ?og og try!{}operatører for strukturer som implementerer Tryegenskapen.
// The preferred method of quick returning Errors
fn write_to_file_question() -> Result<(), MyError> {
let mut file = File::create("my_best_friends.txt")?;
file.write_all(b"This is a list of my best friends.")?;
Ok(())
}
// The previous method of quick returning Errors
fn write_to_file_using_try() -> Result<(), MyError> {
let mut file = r#try!(File::create("my_best_friends.txt"));
r#try!(file.write_all(b"This is a list of my best friends."));
Ok(())
}
Scala
Den nullsikre operatøren i Scala er levert av biblioteket Dsl.scala.
val name = article.?.author.?.name : @ ?
Den @ ?merknad kan bli brukt til å betegne en nullable verdi.
case class Tree(left: Tree @ ? = null, right: Tree @ ? = null, value: String @ ? = null)
val root: Tree @ ? = Tree(
left = Tree(
left = Tree(value = "left-left"),
right = Tree(value = "left-right")
),
right = Tree(value = "right")
)
Normalen .i Scala er ikke nullsikker når du utfører en metode på en nullverdi.
a[NullPointerException] should be thrownBy {
root.right.left.right.value // root.right.left is null!
}
Unntaket kan unngås ved å bruke ?operatoren på nullbar verdi i stedet:
root.?.right.?.left.?.value should be(null)
Hele uttrykket er nullhvis ett av ?er utført på en nullverdi.
Grensen til en nullsikker operatør ?er det nærmeste omsluttende uttrykket hvis type er merket som @ ?.
("Hello " + ("world " + root.?.right.?.left.?.value)) should be("Hello world null")
("Hello " + (("world " + root.?.right.?.left.?.value.?): @ ?)) should be("Hello null")
(("Hello " + ("world " + root.?.right.?.left.?.value.?)): @ ?) should be(null)
Fort
Valgfri kjedeoperatør, abonnentoperatør og ring:
let name = article?.authors?[0].name
let result = protocolVar?.optionalRequirement?()
TypeScript
Valgfri kjedeoperatør var inkludert i Typescript 3.7 -utgivelsen:
let x = foo?.bar?.[0]?.baz();
Visual Basic .NET
Visual Basic 14 og nyere har ?.( operatøren null-betinget medlemstilgang ) og ?()( null-betinget indeksoperatør ), lik C#. De har samme oppførsel som tilsvarende operatører i C#.
Følgende uttalelse oppfører seg identisk med C# -eksemplet ovenfor.
Dim name = articles?(0)?.Author?.Name
Se også
Referanser
Eksterne linker
- PEP 505 , som diskuterer muligheten for sikre navigasjonsoperatører for Python