Veilige navigatie-operator - Safe navigation operator

In object georiënteerd programmeren , de veilige vaart operator (ook bekend als optionele chaining operator , veilige gesprek exploitant , null-conditionele operator ) een binaire operator die terugkeert nul als eerste argument nul; anders voert het een dereferentiebewerking uit zoals gespecificeerd door het tweede argument (meestal een objectlidtoegang, array-index of lambda-aanroep).

Het wordt gebruikt om opeenvolgende expliciete null-controles en -toewijzingen te vermijden en deze te vervangen door methode-/eigenschapsketens. In programmeertalen waar de navigatie-operator (bijv. ".") leidt tot een fout indien toegepast op een null-object, stopt de veilige navigatie-operator de evaluatie van een methode/veldketen en retourneert null als de waarde van de ketenuitdrukking. Het werd voor het eerst gebruikt door Groovy 1.0 in 2007 en wordt momenteel ondersteund in talen zoals C# , Swift , TypeScript , Ruby , Kotlin , Rust en andere. Er is momenteel geen algemene naamgevingsconventie voor deze operator, maar veilige navigatie-operator is de meest gebruikte term.

Het belangrijkste voordeel van het gebruik van deze operator is dat het de onheilspiramide vermijdt . In plaats van meerdere geneste ifs te schrijven, kunnen programmeurs gewoon de gebruikelijke chaining gebruiken, maar vraagtekensymbolen toevoegen voor punten (of andere tekens die worden gebruikt voor chaining).

Terwijl de veilige navigatie operator en null coalescentie operator zijn beide nul-aware operators , ze zijn operationeel anders.

Voorbeelden

Top

Voorbeelden van veilige navigatie-operatoren:

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 en hoger hebben ?.de null-conditional member access-operator (die door Microsoft ook de Elvis-operator wordt genoemd en niet moet worden verward met het algemene gebruik van de term Elvis-operator , waarvan het equivalent in C# ??de null-coalescentie-operator is ) en ?[], de null-conditional element access operator , die een null-safe aanroep van een indexer get accessor uitvoert . Als het type resultaat van de ledentoegang een waardetype is , is het type resultaat van een null-voorwaardelijke toegang van dat lid een null- versie van dat waardetype .

In het volgende voorbeeld wordt de naam opgehaald van de auteur van het eerste artikel in een reeks artikelen (op voorwaarde dat elk artikel een Authorlid heeft en dat elke auteur een Namelid heeft), en resulteert in nullals de reeks is null, als het eerste element is null, als het Authorlid van dat artikel is null, of als het Namelid van die auteur is null. Merk op dat an IndexOutOfRangeExceptionnog steeds wordt gegenereerd als de array niet-null maar leeg is (dwz lengte nul).

var name = articles?[0]?.Author?.Name;

Het aanroepen van een lambda vereist callback?.Invoke(), omdat er geen null-voorwaardelijke aanroep is ( callback?()is niet toegestaan).

var result = callback?.Invoke(args);

Clojure

Clojure heeft geen echte operators in de zin dat andere talen het gebruiken, maar omdat het samenwerkt met Java en objectnavigatie moet uitvoeren wanneer dat het geval is, kan de some->macro worden gebruikt om veilige navigatie uit te voeren.

(some-> article .author .name)

KoffieScript

Existentiële operator:

zip = lottery.drawWinner?().address?.zipcode

Kristal

Crystal ondersteunt de tryveilige navigatiemethode

name = article.try &.author.try &.name

Darten

Operator voor voorwaardelijke toegang voor leden:

var name = article?.author?.name

Gosu

Null veilige aanroepoperator:

var name = article?.author?.name

De null-safe aanroepoperator is niet nodig voor klasseattributen die zijn gedeclareerd als Gosu-eigenschappen:

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

Veilige navigatie-operator en veilige index-operator:

def name = article?.authors?[0].name

JavaScript

Toegevoegd in ECMAScript 2020, biedt de optionele ketenoperator een manier om de toegang tot waarden via verbonden objecten te vereenvoudigen wanneer het mogelijk is dat een verwijzing of functie ongedefinieerd of null is .

const name = article?.authors?.[0]?.name
const result = callback?.()

Het sluit de hele keten van oproepen aan de rechterkant kort: in het volgende voorbeeld is de balk niet "betreden".

null?.foo.bar

Kotlin

Veilige oproep operator:

val name = article?.author?.name

Doelstelling C

Normale navigatiesyntaxis kan in de meeste gevallen worden gebruikt zonder rekening te houden met NULL's, omdat de onderliggende berichten, wanneer ze naar NULL worden verzonden, worden weggegooid zonder nadelige gevolgen.

NSString *name = article.author[0].name;

PHP

De null safe-operator is geaccepteerd voor PHP 8:

$name = $article?->author?->name;

Python

De veilige navigatie-operator wordt niet ondersteund in Python. Het werd voorgesteld voor opname met de volgende syntaxis:

# Proposed syntax, not yet part of the language:
name = article?.author?.name

Raku (Perl 6)

Veilige methode-aanroep:

my $name = $article.?author.?name;

Robijn

Ruby ondersteunt de &.veilige navigatie-operator (ook bekend als de eenzame operator ) sinds versie 2.3.0:

name = article&.author&.name

Roest

Rust ondersteunt de ?en try!{}operators voor structuren die de Tryeigenschap implementeren .

// 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

De null-safe operator in Scala wordt geleverd door de bibliotheek Dsl.scala.

val name = article.?.author.?.name : @ ?

De @ ?annotatie kan worden gebruikt om een ​​nullable waarde aan te duiden.

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")
)

De normaal .in Scala is niet null-safe bij het uitvoeren van een methode op een nullwaarde.

a[NullPointerException] should be thrownBy {
root.right.left.right.value // root.right.left is null!
}

De uitzondering kan worden vermeden door in plaats daarvan de ?operator op de nullable-waarde te gebruiken:

root.?.right.?.left.?.value should be(null)

De volledige expressie is nullals een van ?wordt uitgevoerd op een nullwaarde.

De grens van een nullveilige operator ?is de dichtstbijzijnde omsluitende expressie waarvan het type is geannoteerd als @ ?.

("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)

Snel

Optionele ketenoperator, subscriptoperator en aanroep:

let name = article?.authors?[0].name
let result = protocolVar?.optionalRequirement?()

TypeScript

Optionele chaining-operator is opgenomen in de Typescript 3.7-release:

let x = foo?.bar?.[0]?.baz();

Visual Basic .NET

Visual Basic 14 en hoger hebben de ?.(de null-conditional member access-operator ) en ?()(de null-conditional index-operator ), vergelijkbaar met C#. Ze hebben hetzelfde gedrag als de equivalente operators in C#.

De volgende instructie gedraagt ​​zich identiek aan het bovenstaande C#-voorbeeld.

Dim name = articles?(0)?.Author?.Name

Zie ook

Referenties

Externe links

  • PEP 505 , waarin de mogelijkheid van veilige navigatie-operators voor Python wordt besproken