Jos*_*man 20 ruby messaging dynamic-languages introspection
我希望Ruby的消息传递基础设施意味着可能有一些聪明的技巧.
如何确定调用对象 - 哪个对象称为我当前所使用的方法?
Pet*_*ter 14
您可以轻松查看调用感兴趣函数的代码行
caller.first
Run Code Online (Sandbox Code Playgroud)
它会告诉你调用相关函数的文件名和行号.然后,您可以反向计算它是哪个对象.
然而,听起来你更像是一个调用某个函数的对象,可能是在一个实例方法中.我不知道有一种方法可以解决这个问题 - 但无论如何我都不会使用它,因为它似乎严重违反了封装.
作为一个选项,有一个binding_of_callergem允许您在调用堆栈上的任何调用者的上下文中执行代码(调用者,调用者的调用者等).它对于在开发中检查(读取在调用堆栈上的任何位置执行任何操作)调用堆栈非常有用better_errors.
类的对象
Binding将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用.
我应该提一下,这种技术应该仅用于调试,娱乐或教育目的,因为它严重违反了OOP的原则.
主要是因为eval.
让我们准备一些东西:
require 'binding_of_caller' # I assume, you installed this gem already?
Run Code Online (Sandbox Code Playgroud)
获取立即(最近的堆栈,因此0)调用者实例:
binding.of_caller(0).eval('self')
Run Code Online (Sandbox Code Playgroud)
......甚至是一种即时呼叫方法:
binding.of_caller(0).eval('__method__')
Run Code Online (Sandbox Code Playgroud)
如果您需要升级调用堆栈,请使用除0获取调用方绑定之外的其他数字.
非常hacky.但如果你真的需要这个 - 你去吧.