如何以编程方式确定哪个类/模块定义了被调用的方法?

Posted

技术标签:

【中文标题】如何以编程方式确定哪个类/模块定义了被调用的方法?【英文标题】:How can I programmatically determine which class/module defines a method being called? 【发布时间】:2011-04-25 17:19:11 【问题描述】:

在 Ruby 中,如何以编程方式确定哪个类/模块定义了正在调用的方法?

假设在给定范围内我调用some_method()。在同一个范围内,我想调用一个函数find_method(:some_method),它会返回哪个类、单例类或模块定义了some_method

这里有一些代码来说明我的意思:

class Foo
  include ...

  def bar
    ...
    some_method() # calls a method in scope, assume it exists

    find_method(:some_method) # Returns where the method is defined
                              # e.g. => SomeClassOrModule
    ...
  end
end

我猜我必须使用反射函数的复杂组合,从 self 开始并使用 self.ancestors 遍历继承树,使用 method_defined? 检查方法是否在类上定义或模块,可能还有其他一些技巧来检查从最里面到最外面的范围(因为代码可能在其中运行,例如,instance_eval)。

我只是不知道实现 find_method 的 Ruby 元模型的正确顺序和所有细微之处,因此它在搜索中既详尽无遗,而且从方法分派解决方案的角度来看是正确的。

谢谢!

【问题讨论】:

【参考方案1】:

发现这非常简单。整洁!

扩展this answer,展示如何实际返回所有者类:

foo.method(:some_method).owner

如果您认为有必要,请将其包装在一个实例方法中,但这并不是那么糟糕,嗯?

【讨论】:

甜蜜!是的,比我预期的要容易得多:)

以上是关于如何以编程方式确定哪个类/模块定义了被调用的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式确定蓝牙主/从角色?

java多态

如何简单粗暴的搞定dubbo调用模块

在 xib 中以编程方式自定义 UIView

以编程方式确定 Excel 文件 (.xls) 是不是包含宏

多态抽象类