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

147

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é?

Seth Ladd
la source

Réponses:

273

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 que l'appelant n'est pas obligé 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 de position

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

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

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

Vous pouvez appeler getHttpUrlavec 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 dans la mesure où vous ne pouvez pas les omettre portsi vous souhaitez les 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 que vous ne sachiez ce que sont 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 encapsulé par { }est un paramètre facultatif nommé. Voici un exemple:

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

Vous pouvez appeler getHttpUrlavec 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 pense que les paramètres nommés facilitent la compréhension des sites d'appels, en particulier lorsqu'il existe des indicateurs booléens ou des numéros hors contexte.

Vérifier si un 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 ou des paramètres optionnels nommés, mais pas les deux dans la même fonction ou méthode. Ce qui suit n'est pas autorisé.

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}
Seth Ladd
la source
4
? l'opérateur est obsolète. Je n'ai trouvé que la condition scale == null dans le didacticiel de fléchettes. (expr1? expr2: expr3 fonctionne toujours)
Zdeněk Mlčoch
1
Aimer les multiples paramètres nommés pour une fonction, c'était difficile à trouver! Serait-il encore meilleur dans la partie constructeurs de la documentation? ;)
willsquire
1
Les valeurs par défaut doivent maintenant être spécifiées avec =au lieu de :, selon dartlang.org/guides/language/… .
nbro
31

Dans Dart avec ma compréhension, le paramètre de méthode peut être donné en deux types.

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

>> Paramètre requis

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

production:

length = 10, breath = 20, height = 30

>> Paramètre de position facultatif

Le paramètre sera divulgué avec des crochets [] et les paramètres entre crochets sont facultatifs.

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

production:

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 une accolade {}
  • Les paramètres entre accolades sont facultatifs.
  • devez utiliser le nom du paramètre pour attribuer une valeur séparée par colan :
  • dans l'ordre des paramètres entre accolades n'a pas d'importance
  • ces paramètres de type nous aident à éviter toute confusion lors de la transmission de 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

production:

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 outre, nous pouvons attribuer une valeur par défaut pour ce paramètre.
  • ce qui signifie qu'aucune valeur n'est passée, 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 

production:

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 vidéo.

lien vidéo: OptionalPositionalParameters

lien vidéo: OptionalNamedParameters

lien vidéo: OptionalDefaultParameters

SaravanaRaja
la source
3

Lorsque le paramètre d'une fonction est spécifié à l'aide de la syntaxe "paramName: value", il s'agit d'un paramètre nommé. Ces paramètres peuvent être rendus facultatifs en les plaçant entre crochets [et]. 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');
}
Balepur
la source
2

De doc, nous obtenons que les deux paramètres positionalet namedsont facultatifs, ce qui signifie qu'ils peuvent tous être absents.

À mon avis, les namedparamètres sont plus stricts que les positionalautres. Par exemple, si vous déclarez une telle méthode:

String say({String from, String msg})

Ci from- dessus et msgsont des namedparamètres, lorsque vous appelez la méthode, sayvous devez utiliser say(from: "xx", msg: "xx"). Les clés ne peuvent pas être absentes.

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

Plus confortable
la source
Le document dit:> Les paramètres facultatifs peuvent être nommés ou positionnels, mais pas les deux. Où est-il dit que les paramètres de position sont facultatifs?
Markon
Un paramètre positionnel est le style par défaut des paramètres dans les langages de programmation, appelé positionnel car "c'est le premier paramètre, ou le deuxième, etc.". NamedLes paramètres sont appelés comme ça parce que vous pouvez réellement les identifier par leur nom et non par leur position (si vous changez la position de deux paramètres nommés, cela n'a pas d'importance). Voir la réponse ci-dessus de Savaranaraja
Markon
0

Paramètres de position:

Ils sont identiques aux paramètres par défaut. Par exemple:

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

Ici, y a la valeur par défaut de 3

Paramètres nommés:

Ce sont des paramètres qui peuvent être passés dans n'importe quel ordre en passant le nom du paramètre suivi de la valeur passée. Par exemple:

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

Cette fonction est appelée comme ceci:

sum(num1: 12, num2: 24);

Les paramètres nommés peuvent également avoir des valeurs par défaut.

Zohaib Hamdule
la source