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