2009-12-07 11 views
6

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?

+4

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. –

Antwort

10

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} 
3

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

1

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.

0

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> 
Verwandte Themen