Je voudrais passer un ou plusieurs arguments à une méthode définie à l'aide de define_method, comment ferais-je cela?
ruby
metaprogramming
Sixty4Bit
la source
la source
... et si vous voulez des paramètres optionnels
... autant d'arguments que vous le souhaitez
...combinaison de
... tous
Mettre à jour
Ruby 2.0 a introduit le double splat
**
(deux étoiles) qui ( je cite ) fait:... et bien sûr, vous pouvez également l'utiliser dans la méthode define :)
Exemple d'attributs nommés:
J'essayais de créer un exemple avec un argument de mot-clé, un splat et un double splat tout en un:
ou
... mais cela ne fonctionnera pas, il semble qu'il y ait une limitation. Quand vous y réfléchissez, cela a du sens car l'opérateur splat "capture tous les arguments restants" et double splat "capture tous les arguments mot-clé restants", donc les mélanger casserait la logique attendue. (Je n'ai aucune référence pour prouver ce point doh!)
mise à jour 2018 août:
Article de synthèse: https://blog.eq8.eu/til/metaprogramming-ruby-examples.html
la source
a.foo 1
place defoo 1
). Merci!En plus de la réponse de Kevin Conner: les arguments de bloc ne prennent pas en charge la même sémantique que les arguments de méthode. Vous ne pouvez pas définir d'arguments par défaut ou bloquer des arguments.
Ceci n'est corrigé que dans Ruby 1.9 avec la nouvelle syntaxe alternative "stabby lambda" qui supporte la sémantique complète des arguments de méthode.
Exemple:
la source
Avec la version 2.2, vous pouvez désormais utiliser des arguments de mots clés: https://robots.thoughtbot.com/ruby-2-keyword-arguments
la source