$0
est la variable pour le programme Ruby de niveau supérieur, mais y en a-t-il une pour la méthode actuelle?
$0
est la variable pour le programme Ruby de niveau supérieur, mais y en a-t-il une pour la méthode actuelle?
Réponses:
Encore mieux que ma première réponse, vous pouvez utiliser __method__:
class Foo
def test_method
__method__
end
end
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.
__method__.to_s
et ce sera le nom de la méthode, rien d'autre
Depuis http://snippets.dzone.com/posts/show/2785 :
module Kernel
private
def this_method_name
caller[0] =~ /`([^']*)'/ and $1
end
end
class Foo
def test_method
this_method_name
end
end
puts Foo.new.test_method # => test_method
__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:
require 'pp'
puts RUBY_VERSION
class Foo
def orig
{callee: __callee__, method: __method__}
end
alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )
1.9.3 Sortie:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 Sortie ( __callee__
retourne le nom alias, mais __method__
retourne le nom au point où la méthode a été définie):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Pour Ruby 1.9+, je recommanderais d'utiliser __callee__
__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
params[:action] # it will return method's name
si vous voulez obtenir le nom du contrôleur,
params[:controller] # it will return you controller's name
super
peut être appelée dans un objet SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end