在Ruby中,我如何以编程方式确定哪个类/模块定义了一个被调用的方法?
在给定范围内说我调用some_method()
。在相同的范围内,我想调用一个函数find_method(:some_method)
,它将返回哪个Class,Singleton类或模块定义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元模型的所有微妙之处,因此它在搜索中都是详尽无遗的,并且从方法调度解析的角度来看是正确的。
谢谢!
答案 0 :(得分:8)
发现这非常简单。整齐!
扩展this answer,以显示如何实际返回所有者类:
foo.method(:some_method).owner
如果你觉得有必要,在实例方法中包装它,但那不是那么糟糕,是吗?