有什么方法可以确定哪个对象叫做方法?

Jos*_*man 20 ruby messaging dynamic-languages introspection

我希望Ruby的消息传递基础设施意味着可能有一些聪明的技巧.

如何确定调用对象 - 哪个对象称为我当前所使用的方法?

Pet*_*ter 14

您可以轻松查看调用感兴趣函数的代码行

caller.first
Run Code Online (Sandbox Code Playgroud)

它会告诉你调用相关函数的文件名和行号.然后,您可以反向计算它是哪个对象.

然而,听起来你更像是一个调用某个函数的对象,可能是在一个实例方法中.我不知道有一种方法可以解决这个问题 - 但无论如何我都不会使用它,因为它似乎严重违反了封装.


D-s*_*ide 7

作为一个选项,有一个binding_of_callergem允许您在调用堆栈上的任何调用者的上下文中执行代码(调用者,调用者的调用者等).它对于在开发中检查(读取在调用堆栈上的任何位置执行任何操作)调用堆栈非常有用better_errors.

类的对象Binding将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用.

- http://www.ruby-doc.org/core-2.1.4/Binding.html

我应该提一下,这种技术应该仅用于调试,娱乐或教育目的,因为它严重违反了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.但如果你真的需要这个 - 你去吧.