Valeur par default sur un paramètre d'une fonction

Bonjour tout le monde !

J’aurais une question curieuse … Je me pose la question de savoir s’il existe une différence entre

  bool myFunctionBool({bool params: true}) {return params;}

&

  bool myFunctionBool({bool params = true}) {return params;}

Je ne connais pas Flutter, mais à priori il existe une différence entre les deux fonctions.

La première a forcément besoin que le code appelant lui fournisse une valeur booléenne. Alors que la seconde peut fonctionner sans paramètre, grâce à la valeur par défaut. Cela permet d’alléger le code, et de rendre le programme plus lisible.

En flutter si on veut un paramètre obligatoire on le met hors des {}. Exemple

String myFunctionName(String name, {bool params: true}){
if (params){
  return name;
} else {
  return "Doe";
}

Ici le String est obligatoire et le params est optionnel. On peut l’appeler de deux façons.

String myName = myFunctionName("John");

ou

String myName = myFunctionName("John", params: false);

Le soucis c’est qu’on peut déclarer soit

String myFunctionName(String name, {bool params: true});

soit

String myFunctionName(String name, {bool params = true});

Est-ce qu’il y a une déclaration qui est fausse ou alors les deux sont correctes mais il y a une différences entre les deux ?

Maxime … HELP !!!

@mbritto ? Une idée ?

Si j’ai bien compris, il s’agit, lorsque tu mets. le signe égal, de fournir une valeur par défaut à un paramètre optionnel qui, bien qu’il soit optionnel, ne peut être null, alors que lorsque tu mets les deux points, tu fixes une valeur qui n’est pas par défaut, comme dans l’exemple suivant :

/// Sets the [bold] and [hidden] flags …
void enableFlags({bool bold = false, bool hidden = false}) {…}
// sans valeur par défaut ainsi imposée, null aurait été la valeur par défaut.
// bold will be true; hidden will be false.
enableFlags(bold: true);

Voilà.

1 « J'aime »

Suivant la documentation de Dart (lien ci-dessous).

Les : servent à donner le nom du paramètre lors de l’appel de la fonction.

NomDuParametre: valeur .

Et le = est bien pour assigner une valeur par défaut.

Donc, pour répondre à ta question avec le =, tu n’as pas besoin de donner de valeur, si la valeur par défaut te va. Alors, qu’avec les : tu es obligé de donner une valeur à chaque appel de fonction.

Exemple :

Déclaration

String myFunctionName(String name, {bool params: true});

Appel

myFunctionName(name, params: true) OK
myFunctionName(name) Erreur

Déclaration

String myFunctionName(String name, {bool params = true});

Appel

myFunctionName(name, params: true) OK
myFunctionName(name) OK mais params = true

2 « J'aime »

Ah d’accord, je comprend mieux ! J’avais jamais eu d’erreur de ce type jusqu’a maintenant donc je comprenais pas ce qu’il pouvait mal se passer.
Merci pour vos réponse @ThonyF & @fjacquemin, j’ai bien compris la différence et c’est bon à savoir !

???
Ce n’est pas ce que j’avais dit dans mon post ?

Ah pardon @Draken j’avais pas bien compris l’idée que tu as exprimé dans ta réponse. Toutes mes excuses ^^

Pas grave (remet le pistolet laser dans son étui)

2 « J'aime »

Je ne suis pas certain de ton interprétation @ThonyF .
Normalement, les paramètres nommés sont toujours facultatifs, sauf si on ajoute un required juste avant. Il faut donc toujours donner une valeur par défaut si le required est absent.
Le seul cas particulier est celui des optionnels (types avec un point d’interrogation) puisque la valeur par défaut est null si on ne précise pas autre chose.

Au final concernant la question posée ici :
Lorsque l’on déclare une fonction avec des paramètre facultatif, on utilise toujours le = pour préciser la valeur par défaut.
Si tu utilises les deux-points à la place du égale, tu auras un warning qui te dis d’utiliser le égale à la place.
Je ne sais pas trop où tu as vu cette écriture @AntoLhn, peut être que c’est une ancienne syntaxe qui reste pour des raison de compatibilité mais qui ne doit plus être utilisé.

Les deux-points sont par contre utilisés lors de l’appel de la fonction pour fournir la valeur à transmettre pour ce paramètre.

C’est très certainement parce que mon appli n’est pas encore passée en null safety ^^ du coup je flutter accepte la déclaration

String myFunctionName(String name, {bool params = true});

&

String myFunctionName(String name, {bool params: true});

Je ne sais pourquoi il accepte les deux mais je pense que les « : » seront déprécié plus tard car on m’a dit qu’apparement avant il n’y avait pas de « = ».

1 « J'aime »

Effectivement @mbritto, mon interprétation est fausse. N’étant pas encore dans Flutter, je me base sur ce que je trouve sur internet pour répondre et avec tout ce que j’ai lu, je me suis planté.

Comme quoi on peut être influencé et partir dans un raisonnement faux.

Donc, comme @mbritto a dit seule, le required oblige à mettre une valeur lors de l’appel.

Le = ou les : ne change rien lors de déclaration, mise à pars que les : ne sont plus d’actualité.

Note de la doc Dart : (que j’ai zappé, lors de ma première lecture)

Deprecation note: Old code might use a colon (: ) instead of = to set default values of named parameters. The reason is that originally, only : was supported for named parameters. That support might be deprecated, so we recommend that you use = to specify default values.

Donc @AntoLhn, prends tout de suite les bonnes habitudes et n’utilise plus les :

2 « J'aime »

@ThonyF : Bien vu pour la note dans la doc, je ne l’avais pas vu non plus

1 « J'aime »

D’aaaccooord ! Ok, parfait. Tout est désormais plus clair maintenant.

Merci beaucoup pour vos éclaircissements @ThonyF @mbritto & @Draken .

C’était pas forcement bloquant mais je comprenais pas bien la logique derrière. J’espère que ça pourra aider d’autres à comprendre si jamais certain se pose la même question :slight_smile:

2 « J'aime »