Les paramètres nommés
J'ai de la méthode
def test(String a, String b) { }
et je voudrais appeler cela avec un paramètre dynamique de la carte.
J'ai toujours bien que
test(['1','2']); //valid call
et aussi
test([a:'1',b:'2']); //=> does not work
fonctionne. mais il ne le fait pas. Donc, je me suis souvenu de la propagation de l'opérateur, mais ne peut pas le faire fonctionner....
Est-il possible d'appeler une méthode comme celle ci-dessus avec une sorte de carte en tant que paramètre à la place de paramètres?
- Je n'étais pas au courant groovy pris en charge les paramètres nommés maintenant... Votre exemple ne fonctionne pas dans mon groovy-2.0.6
- Votre sont (en partie) raison - j'ai mis à jour ma question. En partie parce que mon exemple est mauvais, mais groovy prend en charge les paramètres nommés. mrhaki.blogspot.de/2009/09/... - hé, je suppose que c'est la solution à ma question...
- Le groovy langue de la documentation est ici: docs.groovy-lang.org/latest/html/documentation/...
Vous devez vous connecter pour publier un commentaire.
Peut-être que j'ai raté quelque chose, mais je ne pense pas que Groovy a nommé les paramètres de la droite maintenant. Il y a les discussions et propositions, mais je ne suis pas au courant de quoi que ce soit officiel.
Pour votre cas, je pense que la carte de la propagation peut aider, mais pas dans tous les cas. En plus de trouver les valeurs, il suit l'ordre dans lequel les valeurs de la carte ont été déclarés:
Pour les classes, je suggère Groovy est comme opérateur?
value
dans*.value
! C'est donc la solution à ma question initiale:def test(String a, String b) { }\n test([a:'1',b:'2']*.value);
*.value
approche ne fonctionne que lorsque les arguments sont placés dans le bon ordre, car il explicitement ignore clés dans la carte spécifiée (*.value
signifie la même chose que.collect { it.value }
- voir Propagation de l'opérateur).Ne devrait pas l'appel de la méthode être
test(a:'1', b:'2');
au lieu detest([a:'1',b:'2']);
?Veuillez vérifier paramètres Nommés ici.
Les paramètres nommés soutien est assez souple, mais les docs sont un peu minces. Voici quelques règles que j'ai découvert.
Notez que je suis en train de l'être sans équivoque à l'utilisateur de paramètres (déclarée dans la méthode) et args (passé à l'appel de la méthode)
C'est la plus grosse. Et pas évident.
c'est à dire
(a: "aa")
est assez bon, vous n'avez pas besoin([a: "aa"])
comme l'a ordonné args restent dans le même ordre que les paramètres
ils remplissent
C'est assez sympa, mais encore une fois commandés, les arguments doivent être en,
ainsi, l'ordre.
signature de la méthode (voir
x
dans les exemples ci-dessous)args=[:]
fairele nommé args facultatif, mais cela ne fonctionne pas bien si vous avez
d'autres paramètres facultatifs (voir exemples ci-dessous)
Voici quelques exemples:
Les paramètres n'ont pas besoin d'être tapé, mais j'ai ajouté des types pour plus de clarté.
merci pour le commentaire de P, j'ai trouvé une solution qui correspond à mon problème:
si je définir un paramètre sans un type, je peux passer dans toutes sortes de types de, y compris hashMaps. Et groovy tourne une construction comme
a:'h',b:'i'
automatiquement dans une table de hachageDe cette façon, je peux utiliser des paramètres nommés, mais peut utiliser une Carte de trop!
J'ai absolument déteste la façon dont groovy ne fait de position et nom/valeur par défaut des arguments. C'est terrible. Python-t-il droit sans se poser de question.
Problèmes
code
Ce est mauvais parce qu'il modifie l'ordre des arguments de position.
code
Bien sûr, vous pouvez toujours remplacer la fonction de rendre les arguments correspondent à la position que vous voulez. C'est juste un énorme problème quand vous avez beaucoup d'arguments.
code
Ma Solution ...
Finalement ma solution a été de prendre n'importe quel nombre d'arguments comme des Objets et de les cartographier ces arguments avec une Carte d'arguments.
code
Je ne suis pas vraiment heureux avec cette solution, mais il rend le mot-clé arguments de travail pour mes besoins.