Ruby 如何以编程方式确定哪个类/模块定义了要调用的方法?
在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
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
如果您觉得有必要,请将其包装到实例方法中,但这并不是那么糟糕,嗯?太好了!是的,比我想象的容易多了:)