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

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

Również, jak można stwierdzić, czy opcjonalny parametr został rzeczywiście określony?

Author: Paresh Mangukiya, 2012-11-07

6 answers

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

Opcjonalne parametry Dart są opcjonalne w tym, że wywołujący nie jest zobowiązany do podania wartości parametru podczas wywoływania funkcji.

Opcjonalne parametry mogą być zadeklarowane tylko po wymaganych parametrach.

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

Pozycyjne parametry opcjonalne

Parametr owinięty przez [ ] jest pozycyjnym parametrem opcjonalnym. Oto przykład:

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

W powyższym kodzie, port jest opcjonalne i ma domyślną wartość 80.

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

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

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

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

Opcjonalne parametry to pozycyjne w tym, że nie można pominąć port, jeśli chcesz podać 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ć, czym są te pozornie magiczne liczby. Możesz użyć nazwanych opcjonalnych parametrów, aby utworzyć bardziej czytelne interfejsy API.

Nazwane parametry opcjonalne

Parametr owinięty przez { } jest nazwanym parametrem opcjonalnym. Oto przykład:

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

Możesz zadzwonić getHttpUrl z lub bez trzeci parametr. Użytkownik musi używać nazwy parametru podczas wywoływania funkcji.

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ż nazwane parametry są odwołane przez nazwę, mogą być używane 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);

Wierzę, że nazwane parametry ułatwiają zrozumienie witryn wywołujących, zwłaszcza gdy są flagi logiczne lub numery spoza kontekstu.

Sprawdzanie, czy opcja jest opcjonalna parametr został podany

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

Uwaga: możesz używać pozycyjnych parametrów opcjonalnych lub nazwanych parametrami opcjonalnymi, , ale nie obu w tej samej funkcji lub metodzie. Następujące czynności są niedozwolone.

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}
 327
Author: Seth Ladd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-11 08:54:43

W Dart z moim zrozumieniem, parametr metody może być podany w dwóch typach.

  • wymagany parametr
  • opcjonalny parametr (pozycyjny, nazwany i domyślny)

>> Wymagany Parametr

Wymagany parametr jest dobrze znanym parametrem starego 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);

wyjście:

length = 10, breath = 20, height = 30

>> Opcjonalne Pozycjonowanie Parametr

Parametr zostanie ujawniony za pomocą nawiasu kwadratowego[ ] & kwadratowy parametr bracketed jest opcjonalny.

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

wyjście:

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

>> Opcjonalny Parametr Nazwany

  • parametr zostanie ujawniony za pomocą nawiasów klamrowych {}
  • parametr z nawiasami klamrowymi jest opcjonalny.
  • trzeba użyć nazwy parametru, aby przypisać wartość, która jest oddzielona colan :
  • w nawiasach klamrowych kolejność parametrów nie ma znaczenia
  • ten parametr typu pomaga 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

wyjście:

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

>> Opcjonalny Parametr Domyślny

  • podobnie jak opcjonalny parametr o nazwie dodatkowo możemy przypisać domyślną wartość dla tego parametr.
  • co oznacza, że żadna wartość nie zostanie przekazana, zostanie pobrana 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 

wyjście:

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

Dzięki za jasne wyjaśnienie podane z tego linku wideo, napisy do twórcy wideo.

Link Wideo: OptionalPositionalParameters

Link Wideo: OptionalNamedParameters

Link Video: OptionalDefaultParameters

 39
Author: SaravanaRaja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-26 11:48:53

Jeśli parametr funkcji jest określony za pomocą składni "paramName: value" , to jest to parametr nazwany. Takie parametry mogą być opcjonalne, umieszczając je między nawiasami [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');
}
 3
Author: Balepur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 11:14:20

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 poprzez podanie nazwy parametru, po której następuje przekazana wartość. Na przykład:

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

Ta funkcja jest nazywana tak:

sum(num1: 12, num2: 24);

Również nazwane parametry mogą mieć wartości domyślne.

 3
Author: Zohaib Hamdule,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-19 11:50:10

Z doc otrzymujemy, że oba parametry positional i named są opcjonalne, co oznacza, że wszystkie mogą być nieobecne.

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

String say({String from, String msg})

Powyżej from i msg są parametrami named, gdy wywołujesz metodę say musisz użyć say(from: "xx", msg: "xx"). Klucze nie mogą być nieobecne.

Jednak jeśli używasz parametrów pozycyjnych, jesteś wolny.

 1
Author: CoXier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-07 13:15:18

Dart ma dwa rodzaje parametrów funkcji: positional i named.

Opcjonalne parametry pozycyjne

Parametry pozycyjne są takie, które prawdopodobnie znasz:

int sumUp(int a, int b, int c) {
  return a + b + c;
}
// ···
  int total = sumUp(1, 2, 3);

Za pomocą Dart możesz uczynić te parametry pozycyjne opcjonalnymi, owijając je w nawiasy:

int sumUpToFive(int a, [int b, int c, int d, int e]) {
  int sum = a;
  if (b != null) sum += b;
  if (c != null) sum += c;
  if (d != null) sum += d;
  if (e != null) sum += e;
  return sum;
}
// ···
  int total = sumUpToFive(1, 2);
  int otherTotal = sumUpToFive(1, 2, 3, 4, 5);

Opcjonalne parametry pozycyjne są zawsze ostatnie na liście parametrów funkcji. Ich domyślną wartością jest null, chyba że podasz inną domyślną wartość:

int sumUpToFive(int a, [int b = 2, int c = 3, int d = 4, int e = 5]) {
// ···
}
// ···
  int newTotal = sumUpToFive(1);
  print(newTotal); // <-- prints 15

Code example

Zaimplementuj funkcję o nazwie joinWithCommas(), która przyjmuje od jednej do pięciu liczb całkowitych, a następnie zwraca ciąg tych liczb oddzielonych przecinkami. Oto kilka przykładów wywołań funkcji i zwracanych wartości:

String joinWithCommas(int a, [int b, int c, int d, int e]) {
  var total = '$a';
  if (b != null) total = '$total,$b';
  if (c != null) total = '$total,$c';
  if (d != null) total = '$total,$d';
  if (e != null) total = '$total,$e';
  return total;
}

Wywołanie funkcji

joinWithCommas(1)       
joinWithCommas(1, 2, 3)     
joinWithCommas(1, 1, 1, 1, 1)

Zwrócona wartość

'1'
'1,2,3'
'1,1,1,1,1'

Opcjonalne parametry nazwane

Używając składni nawiasów klamrowych, możesz zdefiniować opcjonalne parametry, które mają nazwy.

void printName(String firstName, String lastName, {String suffix}) {
  print('$firstName $lastName ${suffix ?? ''}');
}
// ···
  printName('Avinash', 'Gupta');
  printName('Poshmeister', 'Moneybuckets', suffix: 'IV');

Jak można się spodziewać, wartość tych parametrów domyślnie jest null, ale można podać wartości domyślne:

void printName(String firstName, String lastName, {String suffix = ''}) {
  print('$firstName $lastName $suffix');
}

Funkcja nie może mieć zarówno opcjonalnych parametrów pozycyjnych, jak i opcjonalnych nazwanych.

Przykład kodu

Dodaj metodę instancji copyWith() do klasy MyDataObject. Powinien przyjmować trzy nazwane parametry:

int newInt
String newString
double newDouble

Wywołane, copyWith() powinno zwrócić nową instancję MyDataObject na podstawie bieżącej instancji, z danymi z poprzednich parametrów (jeśli istnieją) skopiowanymi do Właściwości obiektu. Na przykład, jeśli newInt jest INNE niż null, następnie skopiuj jego wartość do anInt.

class MyDataObject {
  final int anInt;
  final String aString;
  final double aDouble;

  MyDataObject({
     this.anInt = 1,
     this.aString = 'Old!',
     this.aDouble = 2.0,
  });

  // Add your copyWith method here:
}
 0
Author: Paresh Mangukiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-22 03:13:40