2009-12-07 12 views

Respuesta

10

Examining the Ruby Call Stack comparte esta información:

¿Alguna vez ha querido ver la pila de llamadas sin levantar una excepción a hacerlo?

caller.each {|c| puts c} 
3

persona que llama es un método de kernel que le permite hacer esto, por lo que llama [0] le permitirá saber el llamador inmediato de la función.

un corte rápido para obtener sólo el nombre de la función podría ser

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

Esto devolverá el nombre del método de llamada como una cadena, que luego se puede utilizar como quiera

1

Ruby la implementación de Kernel#caller se realizó con String s por razones de rendimiento y recolección de basura. Si usted quiere hacer un análisis pila de llamadas más sofisticado, echar un vistazo a esta entrada del blog:

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

El autor pasa por dos implementaciones diferentes de una mejor gráfico de objetos pila de llamadas, implementado en Ruby puro con el (no ampliamente conocido) Kernel#set_trace_func método y otro que funciona como una extensión C para MRI.

Una aplicación de producción no debe usar nada más que la implementación Kernel#caller que viene con Ruby. Si usas las extensiones de arriba extensivamente, probablemente terminarás eliminando la capacidad de Ruby de recolectar basura de manera efectiva y ralentizar tu proceso (lo estimo) hasta varios órdenes de magnitud.

0

Puede escribir algo como esto:

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

Y entonces usted tiene estas pequeñas pruebas:

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> 
No es que esto no es una pregunta válida y todo, pero tener que mirar a la llamada
Cuestiones relacionadas