2009-12-07 15 views

risposta

10

Examining the Ruby Call Stack parti queste informazioni:

Avete mai desiderato di guardare lo stack di chiamate senza sollevare un'eccezione di farlo?

caller.each {|c| puts c} 
3

chiamante è un metodo kernal che ti permette di fare questo, quindi chiamante [0] vi permetterà di conoscere il chiamante immediato della funzione.

un trucco veloce per ottenere solo il nome della funzione potrebbe essere

caller[0][/`\S+/].chop[1..-1] 

Ciò restituirà il nome del metodo chiamante come una stringa, che è quindi possibile utilizzare come vuoi

1

Ruby l'implementazione di Kernel#caller è stata eseguita con String s per motivi di prestazioni e garbage collection. Se si vuole fare di più sofisticate analisi stack di chiamate, dare un'occhiata a questo post del blog:

http://eigenclass.org/hiki/ruby+backtrace+data

L'autore passa attraverso due diverse implementazioni di una migliore chiamata grafo stack di oggetto, quello implementato in puro rubino con la (non ampiamente conosciuto) il metodo Kernel#set_trace_func e un altro che funziona come estensione C alla risonanza magnetica.

Un'applicazione di produzione non deve utilizzare altro che l'implementazione Kernel#caller fornita con Ruby. Se utilizzi estensivamente le estensioni di cui sopra, probabilmente finirai per uccidere l'abilità di Ruby nel raccogliere i rifiuti in modo efficace e rallentare il tuo processo (stimare) fino a diversi ordini di grandezza.

0

È possibile scrivere qualcosa del genere:

module Kernel 
    private 
    def who_is_calling? # Or maybe def who_just_called? 
    caller[1] =~ /`([^']*)'/ and $1 
    end 
end 

E poi si deve questi piccoli test:

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> 
Non che questa non è una domanda valida e tutti, ma dover guardare la chiamata
Problemi correlati