Was ist der Unterschied zwischen benannten und Positionsparametern in Dart?

144

Dart unterstützt sowohl benannte optionale Parameter als auch optionale Positionsparameter. Was sind die Unterschiede zwischen den beiden?

Wie können Sie außerdem feststellen, ob tatsächlich ein optionaler Parameter angegeben wurde?

Seth Ladd
quelle

Antworten:

271

Dart hat zwei Arten von optionalen Parametern: benannt und positionell . Bevor ich die Unterschiede diskutiere, möchte ich zunächst die Ähnlichkeiten diskutieren.

Die optionalen Parameter von Dart sind insofern optional , als der Aufrufer beim Aufrufen der Funktion keinen Wert für den Parameter angeben muss.

Optionale Parameter können nur nach erforderlichen Parametern deklariert werden.

Optionale Parameter können einen Standardwert haben, der verwendet wird, wenn ein Anrufer keinen Wert angibt.

Optionale Positionsparameter

Ein von eingeschlossener Parameter [ ]ist ein optionaler Positionsparameter. Hier ist ein Beispiel:

getHttpUrl(String server, String path, [int port=80]) {
  // ...
}

Im obigen Code portist optional und hat einen Standardwert von 80.

Sie können getHttpUrlmit oder ohne den dritten Parameter aufrufen .

getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80

Sie können mehrere Positionsparameter für eine Funktion angeben:

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) {
  // ...
}

Die optionalen Parameter sind insofern positionell , als Sie sie nicht weglassen können, portwenn Sie sie angeben möchten numRetries.

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', 8080);
getHttpUrl('example.com', '/index.html', 8080, 5);

Wenn Sie nicht wissen, was 8080 und 5 sind, ist es natürlich schwer zu sagen, was diese scheinbar magischen Zahlen sind. Sie können benannte optionale Parameter verwenden , um besser lesbare APIs zu erstellen.

Benannte optionale Parameter

Ein von eingeschlossener Parameter { }ist ein benannter optionaler Parameter. Hier ist ein Beispiel:

getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}

Sie können getHttpUrlmit oder ohne den dritten Parameter aufrufen . Sie müssen den Parameternamen verwenden, wenn Sie die Funktion aufrufen.

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

Sie können mehrere benannte Parameter für eine Funktion angeben:

getHttpUrl(String server, String path, {int port = 80, int numRetries = 3}) {
  // ...
}

Da benannte Parameter namentlich referenziert werden, können sie in einer anderen Reihenfolge als ihre Deklaration verwendet werden.

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', port: 8080);
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5);
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080);
getHttpUrl('example.com', '/index.html', numRetries: 5);

Ich glaube, dass benannte Parameter das Verständnis von Anrufseiten erleichtern, insbesondere wenn es boolesche Flags oder nicht kontextbezogene Nummern gibt.

Überprüfen, ob ein optionaler Parameter angegeben wurde

Leider können Sie nicht zwischen den Fällen "Ein optionaler Parameter wurde nicht angegeben" und "Ein optionaler Parameter wurde mit dem Standardwert bereitgestellt" unterscheiden.

Hinweis: Sie können optionale Positionsparameter oder benannte optionale Parameter verwenden, jedoch nicht beide in derselben Funktion oder Methode. Folgendes ist nicht erlaubt.

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}
Seth Ladd
quelle
4
? Betreiber ist veraltet. Ich habe im Dart-Tutorial nur die Bedingung scale == null gefunden. (Ausdruck1? Ausdruck2: Ausdruck3 funktioniert immer noch)
Zdeněk Mlčoch
1
Es war schwer, die mehrfach benannten Parameter für eine Funktion zu lieben! Würde im Konstruktorteil von Dokumenten noch besser aussehen? ;)
Willsquire
1
Standardwerte sollten jetzt gemäß dartlang.org/guides/language/… mit =statt angegeben werden . :
nbro
31

Nach meinem Verständnis kann der Methodenparameter in Dart in zwei Typen angegeben werden.

  • Erforderlicher Parameter
  • Optionaler Parameter (Position, Name & Standard)

>> Erforderlicher Parameter

Erforderlicher Parameter ist ein bekannter alter Parameter, mit dem wir alle vertraut sind

Beispiel :

findVolume(int length, int breath, int height) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);

Ausgabe:

length = 10, breath = 20, height = 30

>> Optionaler Positionsparameter

Parameter werden mit eckiger Klammer [] angegeben und Parameter mit eckiger Klammer sind optional.

Beispiel:

findVolume(int length, int breath, [int height]) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);//valid
findVolume(10,20);//also valid

Ausgabe:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null

>> Optionaler benannter Parameter

  • Parameter wird mit geschweifter Klammer {} angegeben
  • Parameter in geschweiften Klammern sind optional.
  • müssen den Parameternamen verwenden, um einen Wert zuzuweisen, der durch colan getrennt wird :
  • in geschweiften Klammern spielt die Parameterreihenfolge keine Rolle
  • Diese Typparameter helfen uns, Verwirrung beim Übergeben von Werten für eine Funktion mit vielen Parametern zu vermeiden.

Beispiel:

findVolume(int length, int breath, {int height}) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,height:30);//valid & we can see the parameter name is mentioned here.
findVolume(10,20);//also valid

Ausgabe:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null

>> Optionaler Standardparameter

  • Wie bei einem optionalen benannten Parameter können wir diesem Parameter auch einen Standardwert zuweisen.
  • Dies bedeutet, dass kein Wert übergeben wird. Dieser Standardwert wird übernommen.

Beispiel:

findVolume(int length, int breath, {int height=10}) {
 print('length = $length, breath = $breath, height = $height');
} 

findVolume(10,20,height:30);//valid
findVolume(10,20);//valid 

Ausgabe:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken

Vielen Dank für die klare Erklärung aus diesem Videolink. Dank an den Videokünstler.

Videolink: OptionalPositionalParameters

Videolink: OptionalNamedParameters

Videolink: OptionalDefaultParameters

SaravanaRaja
quelle
3

Wenn der Parameter einer Funktion mit der Syntax "paramName: value" angegeben wird, handelt es sich um einen benannten Parameter. Solche Parameter können optional dargestellt werden, indem sie in Klammern [und] eingeschlossen werden. Eine rudimentäre Demonstration dieser Funktion kann im folgenden Hello World-Programm demonstriert werden:

sayHello([String name = ' World!']) {
  print('Hello, ${name}');
}

void main() {
  sayHello('Govind');
}
Balepur
quelle
2

Aus doc geht hervor , dass sowohl positionalals auch die namedParameter optional sind, was bedeutet, dass sie alle fehlen können.

Meiner Meinung nach sind die namedParameter strenger als positionaldiejenigen. Wenn Sie beispielsweise eine solche Methode deklarieren:

String say({String from, String msg})

Über fromund msgsind namedParameter, wenn Sie Methode aufrufen, saymüssen Sie verwenden say(from: "xx", msg: "xx"). Die Schlüssel dürfen nicht fehlen.

Wenn Sie jedoch Positionsparameter verwenden, sind Sie frei.

CoXier
quelle
Das Dokument sagt:> Optionale Parameter können entweder benannt oder positionell sein, aber nicht beide. Wo steht, dass Positionsparameter optional sind?
Markon
Ein Positionsparameter ist der Standardstil von Parametern in Programmiersprachen, der als Positionsparameter bezeichnet wird, weil "es der erste oder zweite Parameter usw. ist". NamedParameter werden so aufgerufen, weil Sie sie tatsächlich anhand des Namens und nicht anhand der Position identifizieren können (wenn Sie die Position von zwei benannten Parametern wechseln, spielt dies keine Rolle). Siehe die Antwort oben von Savaranaraja
Markon
0

Positionsparameter:

Sie entsprechen den Standardparametern. Beispielsweise:

void add(int x, [int y = 3]);

Hier hat y den Standardwert 3

Benannte Parameter:

Dies sind Parameter, die in beliebiger Reihenfolge übergeben werden können, indem der Name des Parameters gefolgt vom übergebenen Wert übergeben wird. Beispielsweise:

void sum({int num1, int num2});

Diese Funktion heißt folgendermaßen:

sum(num1: 12, num2: 24);

Auch benannte Parameter können Standardwerte haben.

Zohaib Hamdule
quelle