web-dev-qa-db-fra.com

Quelle est la différence entre les paramètres nommés et positionnels dans Dart?

Dart prend en charge à la fois les paramètres facultatifs nommés et les paramètres facultatifs de position. Quelles sont les différences entre les deux?

De plus, comment savoir si un paramètre facultatif a été réellement spécifié?

92
Seth Ladd

Dart a deux types de paramètres facultatifs: nommé et positionnel . Avant de discuter des différences, permettez-moi d'abord de discuter des similitudes.

Les paramètres facultatifs de Dart sont facultatifs en ce sens que l'appelant n'est pas tenu de spécifier une valeur pour le paramètre lors de l'appel de la fonction.

Les paramètres facultatifs ne peuvent être déclarés qu'après les paramètres requis.

Les paramètres facultatifs peuvent avoir une valeur par défaut, qui est utilisée lorsqu'un appelant ne spécifie pas de valeur.

Paramètres optionnels positionnels

Un paramètre enveloppé par [ ] est un paramètre optionnel de position. Voici un exemple:

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

Dans le code ci-dessus, port est facultatif et a une valeur par défaut de 80.

Vous pouvez appeler getHttpUrl avec ou sans le troisième paramètre.

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

Vous pouvez spécifier plusieurs paramètres de position pour une fonction:

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

Les paramètres facultatifs sont positionnels en ce que vous ne pouvez pas omettre port si vous souhaitez spécifier numRetries.

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

Bien sûr, à moins de savoir ce que sont les 8080 et 5, il est difficile de dire quels sont ces nombres apparemment magiques. Vous pouvez utiliser des paramètres facultatifs nommés pour créer des API plus lisibles.

Paramètres facultatifs nommés

Un paramètre enveloppé par { } est un paramètre facultatif nommé. Voici un exemple:

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

Vous pouvez appeler getHttpUrl avec ou sans le troisième paramètre. Vous devez utiliser le nom du paramètre lors de l'appel de la fonction.

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

Vous pouvez spécifier plusieurs paramètres nommés pour une fonction:

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

Les paramètres nommés étant référencés par leur nom, ils peuvent être utilisés dans un ordre différent de leur déclaration.

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

Je crois que les paramètres nommés rendent les sites d'appels plus faciles à comprendre, surtout lorsqu'il y a des drapeaux booléens ou des numéros hors contexte.

Vérification si le paramètre facultatif a été fourni

Malheureusement, vous ne pouvez pas faire la distinction entre les cas "un paramètre facultatif n'a pas été fourni" et "un paramètre facultatif a été fourni avec la valeur par défaut".

Remarque: Vous pouvez utiliser des paramètres optionnels de position o paramètres facultatifs nommés, mais pas les deux dans le même fonction ou méthode. Ce qui suit n'est pas autorisé.

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

Lorsque le paramètre d'une fonction est spécifié à l'aide de la syntaxe "paramName: value", il s'agit alors d'un paramètre nommé. Ces paramètres peuvent être rendus facultatifs en les enfermant entre [et] crochets. Une démonstration rudimentaire de cette fonction peut être démontrée dans le programme Hello World suivant:

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

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

Dans Dart, à ma connaissance, le paramètre de méthode peut être donné en deux types.

  • Paramètre obligatoire
  • Paramètre facultatif (positionnel, nommé et par défaut)

>> Paramètre obligatoire

Le paramètre requis est un paramètre de style ancien bien connu que nous connaissons tous.

exemple :

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

findVolume(10,20,30);

sortie:

length = 10, breath = 20, height = 30

>> Paramètre positionnel facultatif

le paramètre sera divulgué avec un crochet [] et le paramètre entre crochets est facultatif.

exemple:

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

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

sortie:

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

>> Paramètre nommé facultatif

  • le paramètre sera divulgué avec des accolades {}
  • les paramètres entre crochets sont facultatifs.
  • doivent utiliser le nom du paramètre pour attribuer une valeur séparée par colan :
  • dans l'ordre des paramètres entre crochets n'a pas d'importance
  • ces paramètres de type nous aident à éviter toute confusion lors du passage de la valeur pour une fonction qui a de nombreux paramètres.

exemple:

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

sortie:

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

>> Paramètre par défaut facultatif

  • même comme paramètre nommé facultatif en plus, nous pouvons attribuer une valeur par défaut à ce paramètre.
  • ce qui signifie qu'aucune valeur n'est transmise, cette valeur par défaut sera prise.

exemple:

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 

sortie:

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

merci pour l'explication claire donnée à partir de ce lien vidéo, crédits au créateur de la vidéo.

lien vidéo: OptionalPositionalParameters

lien vidéo: OptionalNamedParameters

lien vidéo: OptionalDefaultParameters

1
SaravanaRaja

De doc nous obtenons que les paramètres positional et named sont optionnels, ce qui signifie qu'ils peuvent tous être absents.

À mon avis, les paramètres de named sont plus stricts que ceux de positional. Par exemple, si vous déclarez une telle méthode:

String say({String from, String msg})

Au-dessus de from et msg sont des paramètres named, lorsque vous appelez la méthode say, vous devez utiliser say(from: "xx", msg: "xx"). Les clés ne peuvent pas être absentes.

Cependant, si vous utilisez des paramètres positionnels, vous êtes libre.

0
CoXier