Sé que el método de clase dice cuál es el nombre de la clase de un objeto, ¿cómo podría saber el nombre del método de invocación? ¿Hay alguna manera de saber eso?¿Hay alguna manera de conocer el método de invocación?
Respuesta
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}
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
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.
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
- 1. ¿Hay alguna manera de detener la invocación de un método en tiempo de compilación?
- 2. ¿Hay alguna manera en VBA de conocer las variables que no se están utilizando?
- 3. ¿Hay alguna manera de omitir el parámetro?
- 4. En Matplotlib, ¿hay alguna manera de conocer la lista de formato de salida disponible?
- 5. ¿Alguna manera de optimizar aún más la invocación del método reflectivo de Java?
- 6. ¿Hay alguna manera de "anular" un método con la reflexión?
- 7. ¿Hay alguna manera de identificar un método heredado en Python?
- 8. Método de invocación como cierre
- 9. ¿Hay alguna manera de cancelar StorageFile.CopyAsync()?
- 10. ¿Hay alguna manera de extender el RichString de Scala?
- 11. Método de invocación Java desde PHP5
- 12. ¿Existe alguna manera de conocer los métodos de una instancia de una clase desconocida en Perl
- 13. ¿hay alguna forma de conocer el pid de un programa lanzado?
- 14. Método de invocación por MethodInfo
- 15. ¿Hay alguna manera de ver el código fuente de un método desde la consola de Rails?
- 16. ¿Alguna manera de invocar un método privado?
- 17. ¿Hay alguna manera de ejecutar un método/clase solo en el arranque de Tomcat/Wildfly/Glassfish?
- 18. mockito: ¿Hay alguna manera de capturar el valor de retorno del método stubbed?
- 19. ¿Hay alguna manera de obtener el tamaño de un archivo en .NET usando un método estático?
- 20. ¿Hay alguna manera de llamar a Navigate desde el ViewModel?
- 21. ¿Hay alguna manera funcional de hacerlo?
- 22. ¿Hay alguna manera de evitar recursiones innecesarias?
- 23. ¿Hay alguna manera de animar diseños? [Android]?
- 24. ¿Hay alguna manera de desactivar una etiqueta?
- 25. ¿Hay alguna manera de desarrollar SmartArt personalizado?
- 26. e.preventDefault - ¿hay alguna manera de hacerlo?
- 27. ¿Hay alguna manera de reenviar declarar covarianza?
- 28. ¿Hay alguna manera de obtener el objeto predeterminado de $ .ajax?
- 29. ¿Hay alguna manera de captar el estado real de System.Random?
- 30. ¿Hay alguna manera de cambiar el modo predeterminado de vim?
pila generalmente significa que estás haciendo algo mal. –