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, backportswenn ich Zeit habe (oder eine Pull-Anfrage!).
caller_locations[0].labelauf Ruby 2.2.0 zu sein, sonst haben Sie immer ein send_actionErgebnis
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