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

Ruby 如何以编程方式确定哪个类/模块定义了要调用的方法?,ruby,methods,metaprogramming,dispatch,Ruby,Methods,Metaprogramming,Dispatch,在Ruby中,如何通过编程确定哪个类/模块定义了要调用的方法 假设在给定的范围内,我调用some\u method()。在同一范围内,我想调用一个函数find\u method(:some\u method),该函数将返回定义some\u method的类、单例类或模块 下面是一些代码来说明我的意思: class Foo include ... def bar ... some_method() # calls a method in scope, assume it

在Ruby中,如何通过编程确定哪个类/模块定义了要调用的方法

假设在给定的范围内,我调用
some\u method()
。在同一范围内,我想调用一个函数
find\u method(:some\u method)
,该函数将返回定义
some\u 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.concedens
遍历继承树,使用
method\u defined?
检查是否在类或模块上定义了方法,也许还有其他一些技巧可以从最里面到最外面检查作用域(因为代码可能在
实例中运行,例如
实例评估

我只是不知道Ruby元模型实现
find_method
的正确顺序和所有细微之处,因此它在搜索过程中是详尽的,从方法分派解析的角度来看也是正确的


谢谢

发现这非常简单。干净利落

展开以显示如何实际返回所有者类:

foo.method(:some_method).owner

如果您觉得有必要,请将其包装到实例方法中,但这并不是那么糟糕,嗯?

太好了!是的,比我想象的容易多了:)