web-dev-qa-db-fra.com

Récupère le nom de la méthode en cours d'exécution

$0 est la variable pour le programme de niveau supérieur Ruby), mais existe-t-il un programme pour la méthode actuelle?

186
salt.racer

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.

307
Mark A. Nicolosi

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
23
Mark A. Nicolosi

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}}
16
Kelvin

Pour Ruby 1.9+ je recommanderais d'utiliser __callee__

10
l3x