Как вариант, существует binding_of_caller
gem , который позволяет вам выполнять код в контексте любого вызывающего абонента в стеке вызовов (вызывающего абонента, вызывающего абонента и т. Д.). Это полезно для проверки (читай делать что-либо в любой позиции в стеке вызовов ) стека вызовов в разработке, как используется в better_errors
.
Объекты класса Binding
инкапсулируют контекст выполнения в каком-то конкретном месте в коде и сохраняют этот контекст для будущего использования.
& Ndash; http://www.ruby -doc.org / ядро-2.1.4 / Binding.html
Стоит упомянуть, эта техника должна использоваться только для отладки, для развлечения или в образовательных целях , потому что она очень сильно нарушает принципы ООП.
В основном из-за eval
.
Давайте подготовим материал:
require 'binding_of_caller' # I assume, you installed this gem already?
Получить немедленный (ближайший по стеку, следовательно, 0
) экземпляр вызывающего абонента:
binding.of_caller(0).eval('self')
... или даже метод непосредственного вызова:
binding.of_caller(0).eval('__method__')
Если вам нужно подняться выше стека вызовов, используйте номера, отличные от 0
, для получения привязки звонящего.
Ужасно хаки. Но если вам это действительно нужно, & mdash; вот, пожалуйста.