it-swarm.com.de

Ruft den Namen der aktuell ausgeführten Methode ab

$0 ist die Variable für das Programm der obersten Ebene Ruby), aber gibt es eine für die aktuelle Methode?

186
salt.racer

Noch besser als meine erste Antwort können Sie __method__ verwenden:

class Foo
  def test_method
    __method__
  end
end

Dies gibt ein Symbol zurück - zum Beispiel :test_method. Um den Methodennamen als String zurückzugeben, rufen Sie stattdessen __method__.to_s Auf.

Anmerkung: Dies erfordert Ruby 1.8.7.

307

Von 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

Abhängig davon, was Sie tatsächlich wollen, können Sie entweder __method__ oder __callee__, der den Namen der aktuell ausgeführten Methode als Symbol zurückgibt.

Auf Ruby 1.9) verhalten sich beide identisch (soweit docs und meine Tests betroffen sind).

On Ruby 2.1 & 2.2 __callee__ verhält sich anders, wenn Sie einen Alias ​​der definierten Methode aufrufen. Die docs für die beiden sind unterschiedlich:

  • __method__: "der Name bei der Definition der aktuellen Methode" (d. h. der Name, wie er definiert wurde)
  • __callee__: "der aufgerufene Name der aktuellen Methode" (d. h. der Name, wie er aufgerufen wurde (aufgerufen))

Testskript:

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

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

2.1.2 Ausgabe (__callee__ gibt den Aliasnamen zurück, aber __method__ gibt den Namen an dem Punkt zurück, an dem die Methode definiert wurde):

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

Für Ruby 1.9+ würde ich empfehlen, __callee__

10
l3x