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é?
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!
}
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');
}
Dans Dart, à ma connaissance, le paramètre de méthode peut être donné en deux types.
>> 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
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
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
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.