Come opzione, è disponibile un binding_of_caller
gem che consente di eseguire il codice nel contesto di qualsiasi chiamante nello stack di chiamate (chiamante, chiamante del chiamante e così via). È utile per l'ispezione (leggi fare qualcosa in qualsiasi posizione sullo stack di chiamate) stack di chiamate in fase di sviluppo, come utilizzato in better_errors
.
Gli oggetti della classe Binding
incapsulano il contesto di esecuzione in un punto particolare del codice e mantengono questo contesto per uso futuro.
– http://www.ruby-doc.org/core-2.1.4/Binding.html
Dovrei citare, questa tecnica dovrebbe essere utilizzato solo per il debug, divertimento o scopi educativi, perché viola i principi della programmazione orientata agli oggetti davvero male.
Principalmente a causa di eval
.
Prepariamo roba:
require 'binding_of_caller' # I assume, you installed this gem already?
Prendi il immediato (più vicino sulla pila, quindi 0
) istanza chiamante :
binding.of_caller(0).eval('self')
...o anche un metodo chiamante immediato:
binding.of_caller(0).eval('__method__')
Se avete bisogno di ottenere più in alto lo stack di chiamate, utilizzare numeri diversi da 0
per ottenere vincolante di un chiamante.
Terribilmente hacky. Ma se hai davvero bisogno di questo — vai.
fonte
2014-11-07 12:38:21
++ Amico, questo è semplicemente meraviglioso come che sembra come una Z – Pierreten
stilizzata ho letto la domanda che all'interno del tuo 'test()' OP vuole ottenere l'oggetto che si ottiene se si digita 'self' in irb. – lulalala