Como opción, hay un binding_of_caller
gem que le permite ejecutar código en el contexto de cualquier persona que llama en la pila de llamadas (llamante, llamante, etc.). Es útil para inspeccionar (lea haga cualquier cosa en cualquier posición en la pila de llamadas) call stack in development, como se usa en better_errors
.
Los objetos de la clase Binding
encapsulan el contexto de ejecución en algún lugar particular del código y conservan este contexto para uso futuro.
– http://www.ruby-doc.org/core-2.1.4/Binding.html
Debo mencionar, esta técnica sólo se debe utilizar para la depuración, diversión o con fines educativos, porque viola los principios de la programación orientada a objetos muy mal.
Principalmente por eval
.
Vamos a preparar cosas:
require 'binding_of_caller' # I assume, you installed this gem already?
Consigue el (la más cercana en la pila, por lo tanto, 0
) instancia de llamada inmediata:
binding.of_caller(0).eval('self')
...o incluso un método de llamada inmediata:
binding.of_caller(0).eval('__method__')
Si usted necesita para obtener más arriba en la pila de llamadas, utilizar números distintos de 0
para conseguir de una persona que llama vinculante.
Awfully hacky. Pero si realmente necesitas este —, ahí tienes.
++ Amigo, eso es totalmente impresionante la forma en que se ve como un Z estilizado – Pierreten
Leí la pregunta que dentro de su 'test()' OP quiere obtener el objeto que obtienes si escribes 'self' en irb. – lulalala