$0
est la variable pour le programme de niveau supérieur Ruby), mais existe-t-il un programme pour la méthode actuelle?
Même mieux que ma première réponse, vous pouvez utiliser __method__:
class Foo
def test_method
__method__
end
end
Ceci retourne un symbole - par exemple, :test_method
. Pour renvoyer le nom de la méthode sous forme de chaîne, appelez __method__.to_s
au lieu.
Note: Cela nécessite Ruby 1.8.7.
De 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
Selon ce que vous voulez réellement, vous pouvez utiliser soit __method__
ou __callee__
, qui renvoie 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 docs et mes tests).
On Ruby 2.1 & 2.2 __callee__
se comporte différemment si vous appelez un alias de la méthode définie. Les docs pour les deux sont différents:
__method__
: "le nom à la définition de la méthode en cours" (c'est-à-dire le nom tel qu'il a été défini)__callee__
: "le nom appelé de la méthode en cours" (c’est-à-dire le nom tel qu’elle a été appelée (appelé))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__
renvoie le nom avec alias, mais __method__
renvoie 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__