Gibt es in Ruby eine Möglichkeit, den Namen der aufrufenden Methode innerhalb einer Methode zu finden?
Beispielsweise:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Gibt es in Ruby eine Möglichkeit, den Namen der aufrufenden Methode innerhalb einer Methode zu finden?
Beispielsweise:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Antworten:
puts caller[0]
oder vielleicht...
puts caller[0][/`.*'/][1..-2]
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Ich denke, das ist nur für Ruby.
In Ruby 2.0.0 können Sie Folgendes verwenden:
caller_locations(1,1)[0].label
Es ist viel schneller als die Ruby 1.8+ Lösung:
caller[0][/`([^']*)'/, 1]
Wird aufgenommen, backports
wenn ich Zeit habe (oder eine Pull-Anfrage!).
caller_locations[0].label
auf Ruby 2.2.0 zu sein, sonst haben Sie immer ein send_action
Ergebnis
Verwenden Sie caller_locations(1,1)[0].label
(für Rubin> = 2,0)
Bearbeiten : Meine Antwort lautete "verwenden", __method__
aber ich habe mich geirrt, es wird der aktuelle Methodenname zurückgegeben.
ich benutze
caller[0][/`([^']*)'/, 1]
'
über das gesuchte hinaus enthält (und ich nehme an, dass dies nicht möglich ist), wird das Ergebnis sicher dasselbe sein. Die [^']*
Leistung wird jedoch besser, da die Regex-Engine nicht mehr versucht, diesem Teil den Ausdruck zuzuordnen, sobald er einen erreicht '
(Ihre Version wird bis zum Ende gehen und dann zurückverfolgen, weil sie '
am Ende keinen gefunden hat ). Der Unterschied ist in diesem Fall natürlich vernachlässigbar, aber es ist eine gute Angewohnheit, .
Regexe nach Möglichkeit zu vermeiden .
Wie wäre es mit
caller[0].split("`").pop.gsub("'", "")
Viel sauberer imo.
Stattdessen können Sie es als Bibliotheksfunktion schreiben und bei Bedarf einen Anruf tätigen. Der Code lautet wie folgt:
module CallChain
def self.caller_method(depth=1)
parse_caller(caller(depth+1).first).last
end
private
# Copied from ActionMailer
def self.parse_caller(at)
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
file = Regexp.last_match[1]
line = Regexp.last_match[2].to_i
method = Regexp.last_match[3]
[file, line, method]
end
end
end
Um die obige Modulmethode auszulösen, müssen Sie Folgendes aufrufen:
caller = CallChain.caller_method
Um die Anrufer- und Angerufeneninformationen in einer beliebigen Sprache anzuzeigen, sei es Ruby, Java oder Python, sollten Sie sich immer die Stapelverfolgung ansehen. In einigen Sprachen wie Rust und C ++ sind im Compiler Optionen integriert, mit denen Sie einen Profilierungsmechanismus aktivieren können, den Sie zur Laufzeit anzeigen können. Ich glaube, es gibt eine für Ruby namens Ruby-Prof.
Und wie oben erwähnt, können Sie im Ausführungsstapel nach Ruby suchen. Dieser Ausführungsstapel ist ein Array, das Backtrace-Standortobjekte enthält.
Im Wesentlichen müssen Sie über diesen Befehl nur Folgendes wissen:
Aufrufer (Start = 1, Länge = Null) → Array oder Null