$0
est la variable pour le programme Ruby de niveau supérieur, mais y en a-t-il une pour la méthode actuelle?
ruby
reflection
metaprogramming
salt.racer
la source
la source
super
peut être appelée dans un objet SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Réponses:
Encore mieux que ma première réponse, vous pouvez utiliser __method__:
Cela renvoie un symbole - par exemple
:test_method
,. Pour renvoyer le nom de la méthode sous forme de chaîne, appelez__method__.to_s
place.Remarque: Cela nécessite Ruby 1.8.7.
la source
__method__.to_s
et ce sera le nom de la méthode, rien d'autreDepuis http://snippets.dzone.com/posts/show/2785 :
la source
__callee__
pas ça?Selon ce que vous voulez réellement, vous pouvez utiliser soit
__method__
ou__callee__
, qui renvoient le nom de la méthode en cours d'exécution sous forme de symbole.Sur ruby 1.9, les deux se comportent de manière identique (en ce qui concerne les documents et mes tests).
Sur ruby 2.1 et 2.2
__callee__
se comporte différemment si vous appelez un alias de la méthode définie. Les documents pour les deux sont différents:__method__
: "le nom à la définition de la méthode courante" (ie le nom tel qu'il a été défini)__callee__
: "le nom appelé de la méthode courante" (ie le nom tel qu'il a été appelé (invoqué))Script de test:
1.9.3 Sortie:
2.1.2 Sortie (
__callee__
retourne le nom alias, mais__method__
retourne le nom au point où la méthode a été définie):la source
Pour Ruby 1.9+, je recommanderais d'utiliser
__callee__
la source
__callee__
se comporte différemment avant la 1.9, il est donc préférable de s'y tenir__method__
car il a un comportement cohérent.__callee__
se comporte comme__method__
après 1.9.def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2
Ne voyez-vous rien d'étrange?__callee__
et__method__
a un comportement différent. Voir pastie.org/10380985 (ruby 2.1.5)J'ai eu le même problème pour récupérer le nom de la méthode dans le fichier de vue. J'ai la solution par
si vous voulez obtenir le nom du contrôleur,
la source