Dart prend en charge les paramètres optionnels nommés et les paramètres optionnels positionnels. Quelles sont les différences entre les deux ?
De même, comment savoir si un paramètre facultatif a réellement été spécifié ?
Dart prend en charge les paramètres optionnels nommés et les paramètres optionnels positionnels. Quelles sont les différences entre les deux ?
De même, comment savoir si un paramètre facultatif a réellement été spécifié ?
Dart dispose de deux types de paramètres de fonction : positional
y named
.
Paramètres positionnels facultatifs
Les paramètres positionnels sont ceux que vous connaissez probablement :
int sumUp(int a, int b, int c) {
return a + b + c;
}
// ···
int total = sumUp(1, 2, 3);
Avec Dart, vous pouvez rendre ces paramètres positionnels facultatifs en les mettant entre parenthèses :
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);
Les paramètres positionnels facultatifs sont toujours les derniers dans la liste des paramètres d'une fonction. Leur valeur par défaut est null, sauf si vous fournissez une autre valeur par défaut :
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
Implémentez une fonction appelée joinWithCommas()
qui accepte un à cinq entiers, puis renvoie une chaîne de ces nombres séparés par des virgules. Voici quelques exemples d'appels de fonctions et de valeurs renvoyées :
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;
}
Appel de fonction
joinWithCommas(1)
joinWithCommas(1, 2, 3)
joinWithCommas(1, 1, 1, 1, 1)
Valeur retournée
'1'
'1,2,3'
'1,1,1,1,1'
Paramètres nommés facultatifs
En utilisant une syntaxe d'accolade, vous pouvez définir des paramètres facultatifs qui ont des noms.
void printName(String firstName, String lastName, {String suffix}) {
print('$firstName $lastName ${suffix ?? ''}');
}
// ···
printName('Avinash', 'Gupta');
printName('Poshmeister', 'Moneybuckets', suffix: 'IV');
Comme vous pouvez vous y attendre, la valeur de ces paramètres est nulle par défaut, mais vous pouvez fournir des valeurs par défaut :
void printName(String firstName, String lastName, {String suffix = ''}) {
print('$firstName $lastName $suffix');
}
Une fonction ne peut pas avoir à la fois des paramètres optionnels positionnels et optionnels nommés.
Exemple de code
Ajouter un copyWith()
à la classe MyDataObject. Elle doit prendre trois paramètres nommés :
int newInt
String newString
double newDouble
Quand on l'appelle, copyWith()
doit retourner un nouveau MyDataObject
basé sur l'instance actuelle, avec les données des paramètres précédents (le cas échéant) copiées dans les propriétés de l'objet. Par exemple, si newInt
n'est pas nul, alors copiez sa valeur dans le fichier 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:
}
De doc nous obtenons que les deux positional
y named
sont facultatifs, ce qui signifie qu'ils peuvent tous être absents.
A mon avis, named
sont plus stricts que les paramètres positional
ceux. Par exemple, si vous déclarez une telle méthode :
String say({String from, String msg})
Au-dessus de from
y msg
sont named
lorsque vous appelez la méthode say
vous devez utiliser say(from: "xx", msg: "xx")
. Les touches ne peuvent pas être absentes.
Cependant, si vous utilisez des paramètres positionnels, vous êtes libre.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.