Ich weiß, die Klassenmethode sagt, was ist der Name der Klasse eines Objekts, wie kann ich den Namen der aufrufenden Methode wissen? Gibt es eine Möglichkeit das zu wissen?Gibt es eine Möglichkeit, die aufrufende Methode zu kennen?
Antwort
Examining the Ruby Call Stack teilt diese Informationen:
Haben Sie schon einmal bei den Call-Stack aussehen wollte es eine Ausnahme ohne Erhöhung zu tun?
caller.each {|c| puts c}
Anrufer ist ein Kernal-Methode, die Sie dies tun können, so Anrufer [0] werden Sie den unmittelbaren Aufrufer der Funktion wissen lassen.
ein schneller Hack nur der Name der Funktion erhalten kann
caller[0][/`\S+/].chop[1..-1]
sein, dies den Namen der anrufenden Methode als String zurück, die Sie dann aber wollen Sie
Ruby verwenden können Implementierung von Kernel#caller
wurde mit String
s für die Leistung und Speicherbereinigung Gründen getan. Wenn Sie anspruchsvollere Call-Stack-Analyse machen wollen, werfen Sie einen Blick auf dieser Blog-Post:
http://eigenclass.org/hiki/ruby+backtrace+data
Der Autor durch zwei verschiedene Implementierungen eines besseren Call-Stack Objektgraph, ein implementiert in reinem Rubin mit der geht (nicht weit verbreitet) Kernel#set_trace_func
Methode und eine andere, die als eine C-Erweiterung der MRI funktioniert.
Eine Produktionsanwendung sollte nichts anderes als die Implementierung Kernel#caller
verwenden, die mit Ruby geliefert wird. Wenn Sie die obigen Erweiterungen ausgiebig verwenden, werden Sie wahrscheinlich Rubys Fähigkeit verlieren, effektiv zu sammeln und Ihren Prozess (ich schätze es) um mehrere Größenordnungen zu verlangsamen.
Sie so etwas schreiben kann:
module Kernel
private
def who_is_calling? # Or maybe def who_just_called?
caller[1] =~ /`([^']*)'/ and $1
end
end
Und dann haben Sie diese kleinen Tests:
irb(main):056:0* def this_is_a_method
irb(main):057:1> puts "I, 'this_is_a_method', was called upon by: '#{who_is_calling?}'"
irb(main):058:1> end
=> nil
irb(main):059:0> def this_is_a_method_that_calls_another
irb(main):060:1> this_is_a_method
irb(main):061:1> end
=> nil
irb(main):062:0> this_is_a_method_that_calls_another
I, 'this_is_a_method', was called upon by: 'this_is_a_method_that_calls_another'
=> nil
irb(main):063:0> this_is_a_method
I, 'this_is_a_method', was called upon by: 'irb_binding'
=> nil
irb(main):064:0>
Nicht, dass dies keine gültige Frage ist, und alles, aber auf den Ruf zu suchen, die Stack bedeutet normalerweise, dass Sie etwas falsch machen. –