$0
ist die Variable für das Ruby-Programm der obersten Ebene, aber gibt es eine für die aktuelle Methode?
$0
ist die Variable für das Ruby-Programm der obersten Ebene, aber gibt es eine für die aktuelle Methode?
Antworten:
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
. Rufen Sie __method__.to_s
stattdessen auf, um den Methodennamen als Zeichenfolge zurückzugeben .
Hinweis: Dies erfordert Ruby 1.8.7.
__method__.to_s
und es wird der Methodenname sein, sonst nichts
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
__callee__
nicht?
Je nachdem, was Sie tatsächlich möchten, können Sie entweder __method__
oder verwenden __callee__
, die den Namen der aktuell ausgeführten Methode als Symbol zurückgeben.
In Ruby 1.9 verhalten sich beide identisch ( in Bezug auf die Dokumente und meine Tests).
In Ruby 2.1 und 2.2 __callee__
verhält es sich anders, wenn Sie einen Alias der definierten Methode aufrufen. Die Dokumente für die beiden sind unterschiedlich:
__method__
: "der Name bei der Definition der aktuellen Methode" (dh der Name, wie er definiert wurde)__callee__
: "der aufgerufene Name der aktuellen Methode" (dh 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, gibt jedoch __method__
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}}
Für Ruby 1.9+ würde ich die Verwendung empfehlen __callee__
__callee__
verhält sich vor 1.9 anders, daher ist es am besten, sich daran zu halten, __method__
da es ein konsistentes Verhalten aufweist. __callee__
verhält sich genauso wie __method__
nach 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
du nichts Seltsames?
__callee__
und __method__
hat anderes Verhalten. Siehe pastie.org/10380985 (Ruby 2.1.5)
Ich habe das gleiche Problem beim Abrufen des Methodennamens in der Ansichtsdatei. Ich habe die Lösung von bekommen
params[:action] # it will return method's name
Wenn Sie den Namen des Controllers erhalten möchten, dann
params[:controller] # it will return you controller's name
super
kann innerhalb eines SimpleDelegator-Objekts aufgerufen werden:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end