Jaka jest różnica między parametrami nazwanymi i pozycyjnymi w Dart?


146

Dart obsługuje zarówno nazwane parametry opcjonalne, jak i pozycyjne parametry opcjonalne. Jakie są różnice między nimi?

Ponadto, jak możesz stwierdzić, czy faktycznie określono opcjonalny parametr?

Odpowiedzi:


272

Dart ma dwa typy parametrów opcjonalnych: nazwane i pozycyjne . Zanim omówię różnice, najpierw omówię podobieństwa.

Opcjonalne parametry Darta są opcjonalne , ponieważ obiekt wywołujący nie musi określać wartości parametru podczas wywoływania funkcji.

Parametry opcjonalne można zadeklarować tylko po dowolnych wymaganych parametrach.

Parametry opcjonalne mogą mieć wartość domyślną, która jest używana, gdy obiekt wywołujący nie określa wartości.

Pozycyjne parametry opcjonalne

Parametr zawijany przez [ ]jest opcjonalnym parametrem pozycyjnym. Oto przykład:

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

W powyższym kodzie portjest opcjonalny i ma domyślną wartość 80.

Możesz wywołać getHttpUrlz trzecim parametrem lub bez niego.

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

Dla funkcji można określić wiele parametrów pozycyjnych:

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

Opcjonalne parametry są pozycyjne i nie możesz ich pominąć, portjeśli chcesz je określić numRetries.

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

Oczywiście, jeśli nie wiesz, czym są 8080 i 5, trudno powiedzieć, jakie są te pozornie magiczne liczby. Możesz użyć nazwanych parametrów opcjonalnych aby utworzyć bardziej czytelne interfejsy API.

Nazwane parametry opcjonalne

Parametr zawijany przez { }to nazwany parametr opcjonalny. Oto przykład:

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

Możesz wywołać getHttpUrlz trzecim parametrem lub bez niego. Państwo musi przy wywołaniu funkcji użyć nazwy parametru.

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

Możesz określić wiele nazwanych parametrów dla funkcji:

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

Ponieważ do nazwanych parametrów odwołuje się nazwa, można ich używać w kolejności innej niż ich deklaracja.

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

Uważam, że nazwane parametry ułatwiają zrozumienie witryn wywołujących, zwłaszcza gdy występują flagi logiczne lub numery poza kontekstem.

Sprawdzanie, czy podano opcjonalny parametr

Niestety, nie można rozróżnić przypadków „nie podano opcjonalnego parametru” i „opcjonalny parametr został dostarczony z wartością domyślną”.

Uwaga: Możesz użyć opcjonalnych parametrów pozycyjnych lub nazwanych parametrów opcjonalnych, ale nie obu w tej samej funkcji lub metodzie. Następujące elementy są niedozwolone.

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}

4
? operator został wycofany. Znalazłem tylko stan scale == null w samouczku do rzutek. (wyr1? wyr2: wyr3 nadal działa)
Zdeněk Mlčoch

1
Uwielbiając wiele nazwanych parametrów funkcji, było to trudne do znalezienia! Czy wyglądałby jeszcze lepiej w części dokumentacyjnej dotyczącej konstruktorów? ;)
willsquire

1
Wartości domyślne powinny być teraz określane za pomocą =zamiast :, zgodnie z dartlang.org/guides/language/… .
nbro

31

W Dart, w moim rozumieniu, parametr metody można podać w dwóch typach.

  • Wymagany parametr
  • Opcjonalny parametr (pozycyjny, nazwany i domyślny)

>> Wymagany parametr

Parametr wymagany to dobrze znany parametr w starym stylu, który wszyscy znamy

przykład :

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

findVolume(10,20,30);

wynik:

length = 10, breath = 20, height = 30

>> Opcjonalny parametr pozycyjny

parametr zostanie ujawniony w nawiasach kwadratowych [], a parametry w nawiasach kwadratowych są opcjonalne.

przykład:

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

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

wynik:

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

>> Opcjonalny nazwany parametr

  • parametr będzie podawany w nawiasach klamrowych {}
  • parametry w nawiasach klamrowych są opcjonalne.
  • należy użyć nazwy parametru, aby przypisać wartość oddzieloną dwukropkiem :
  • w nawiasach klamrowych kolejność parametrów nie ma znaczenia
  • te parametry typu pomagają nam uniknąć nieporozumień podczas przekazywania wartości funkcji, która ma wiele parametrów.

przykład:

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

wynik:

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

>> Opcjonalny parametr domyślny

  • tak samo jak opcjonalny nazwany parametr dodatkowo możemy przypisać domyślną wartość dla tego parametru.
  • co oznacza, że ​​żadna wartość nie zostanie przekazana, zostanie przyjęta wartość domyślna.

przykład:

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 

wynik:

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

dzięki za jasne wyjaśnienie podane w tym linku wideo, podziękowania dla twórcy wideo.

łącze wideo: OptionalPositionalParameters

łącze wideo: OptionalNamedParameters

łącze wideo: OptionalDefaultParameters


3

Jeśli parametr funkcji jest określony przy użyciu składni „nazwa_param: wartość”, jest to nazwany parametr. Takie parametry można renderować jako opcjonalne, umieszczając je w nawiasach [i]. Podstawową demonstrację tej funkcji można zademonstrować w następującym programie Hello World:

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

void main() {
  sayHello('Govind');
}

2

Z doc dowiadujemy się, że oba parametry positionali namedsą opcjonalne, co oznacza, że ​​wszystkie mogą być nieobecne.

Moim zdaniem namedparametry są bardziej rygorystyczne niż positionaljedne. Na przykład, jeśli zadeklarujesz taką metodę:

String say({String from, String msg})

Powyżej fromi msgnamedparametrami, kiedy wywołujesz metodę, sayktórej musisz użyć say(from: "xx", msg: "xx"). Kluczy nie może zabraknąć.

Jeśli jednak używasz parametrów pozycyjnych, jesteś wolny.


Dokument mówi:> Parametry opcjonalne mogą być nazwane lub pozycyjne, ale nie oba. Gdzie jest napisane, że parametry pozycyjne są opcjonalne?
Markon

Parametr pozycyjny to domyślny styl parametrów w językach programowania, nazywany pozycyjnym, ponieważ „jest to pierwszy parametr, drugi itd.”. Namedparametry nazywane są w ten sposób, ponieważ można je zidentyfikować po nazwie, a nie po pozycji (jeśli zmienisz pozycję dwóch nazwanych parametrów, nie ma to znaczenia). Zobacz odpowiedź powyżej od Savaranaraja
Markon

0

Parametry pozycyjne:

Są takie same jak parametry domyślne. Na przykład:

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

Tutaj y ma domyślną wartość 3

Nazwane parametry:

Są to parametry, które można przekazać w dowolnej kolejności, przekazując nazwę parametru, po której następuje przekazana wartość. Na przykład:

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

Ta funkcja nazywa się następująco:

sum(num1: 12, num2: 24);

Nazwane parametry również mogą mieć wartości domyślne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.