4

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

说在我调用的给定范围内some_method()。在同一范围内,我想调用一个函数,该函数find_method(:some_method)将返回哪个 Class、Singleton Class 或 Module 定义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.ancestorsmethod_defined?instance_eval

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

谢谢!

4

1 回答 1

8

发现这出乎意料的简单。整洁的!

扩展这个答案,展示如何实际返回所有者类:

foo.method(:some_method).owner

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

于 2010-10-15T01:29:54.613 回答