[Ruby] Ottieni il nome del metodo attualmente in esecuzione


Answers

Da 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
Question

$0 è la variabile per il programma Ruby di primo livello, ma ce n'è una per il metodo corrente?




A seconda di ciò che realmente si desidera, è possibile utilizzare __method__ o __callee__ , che restituiscono il nome del metodo attualmente in esecuzione come un simbolo.

Su Ruby 1.9, entrambi si comportano in modo identico (per quanto riguarda i docs ei miei test).

Su ruby ​​2.1 e 2.2 __callee__ si comporta in modo diverso se si chiama un alias del metodo definito (vedere la descrizione doc leggermente diversa)

Script di prova:

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 Uscita:

1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:orig, :method=>:orig}}

2.1.2 Output ( __callee__ restituisce il nome alias, ma __method__ restituisce il nome nel punto in cui è stato definito il metodo):

2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:myalias, :method=>:orig}}



Links