Nouveau sur Ruby et ROR et j'adore ça chaque jour, alors voici ma question car je ne sais pas comment le google (et j'ai essayé :))
nous avons la méthode
def foo(first_name, last_name, age, sex, is_plumber)
# some code
# error happens here
logger.error "Method has failed, here are all method arguments #{SOMETHING}"
end
Donc ce que je cherche un moyen d'obtenir tous les arguments passés à la méthode, sans énumérer chacun d'eux. Puisqu'il s'agit de Ruby, je suppose qu'il y a un moyen :) si c'était java, je les énumérerais simplement :)
La sortie serait:
Method has failed, here are all method arguments {"Mario", "Super", 40, true, true}
ruby-on-rails
ruby
Haris Krajina
la source
la source
method(__method__).parameters.map { |_, v| [v, binding.local_variable_get(v)] }
Réponses:
Dans Ruby 1.9.2 et versions ultérieures, vous pouvez utiliser la
parameters
méthode sur une méthode pour obtenir la liste des paramètres de cette méthode. Cela renverra une liste de paires indiquant le nom du paramètre et s'il est requis.par exemple
Si tu fais
puis
Vous pouvez utiliser la variable spéciale
__method__
pour obtenir le nom de la méthode actuelle. Ainsi, dans une méthode, les noms de ses paramètres peuvent être obtenus viaVous pouvez alors afficher le nom et la valeur de chaque paramètre avec
Remarque: depuis que cette réponse a été écrite à l'origine, dans les versions actuelles de Ruby
eval
ne peut plus être appelée avec un symbole. Pour résoudre ce problème, un expliciteto_s
a été ajouté lors de la construction de la liste des noms de paramètres ieparameters.map { |arg| arg[1].to_s }
la source
Depuis Ruby 2.1, vous pouvez utiliser binding.local_variable_get pour lire la valeur de n'importe quelle variable locale, y compris les paramètres de méthode (arguments). Grâce à cela, vous pouvez améliorer la réponse acceptée pour éviter
maleval.la source
Hash[method(__method__).parameters.map.collect { |_, name| [name, binding.local_variable_get(name)] }]
Une façon de gérer cela est:
la source
C'est une question intéressante. Peut-être en utilisant local_variables ? Mais il doit y avoir un autre moyen que d'utiliser eval. Je cherche dans la documentation du noyau
la source
eval var.to_s
. De plus, une mise en garde à ceci est que si vous définissez des variables locales avant d' exécuter cette boucle, elles seront incluses en plus des paramètres de méthode.local_variables
, elle retournera les arguments de méthode + toutes les variables locales. Cela peut provoquer des erreurs lorsque votre code.Cela peut être utile ...
la source
callers_name
implémentation légèrement piratée , vous pouvez également transmettre le__method__
fichierbinding
.Vous pouvez définir une constante telle que:
Et utilisez-le dans votre code comme:
la source
Avant d'aller plus loin, vous passez trop d'arguments dans foo. Il semble que tous ces arguments sont des attributs sur un modèle, n'est-ce pas? Vous devriez vraiment passer l'objet lui-même. Fin du discours.
Vous pouvez utiliser un argument "splat". Il met tout dans un tableau. Cela ressemblerait à:
la source
Si vous souhaitez modifier la signature de la méthode, vous pouvez faire quelque chose comme ceci:
Ou:
Dans ce cas, interpolé
args
ouopts.values
sera un tableau, mais vous pouvezjoin
si sur virgule. À votre santéla source
Il semble que ce que cette question essaie d'accomplir pourrait être fait avec un joyau que je viens de publier, https://github.com/ericbeland/exception_details . Il listera les variables locales et les vlaues (et les variables d'instance) des exceptions sauvées. Ça vaut peut-être le coup d'œil ...
la source
better_errors
bijou.Si vous avez besoin d'arguments en tant que hachage et que vous ne voulez pas polluer le corps de la méthode avec une extraction délicate des paramètres, utilisez ceci:
Ajoutez simplement cette classe à votre projet:
la source
Si la fonction est à l'intérieur d'une classe, vous pouvez faire quelque chose comme ceci:
la source