Ruby如何获取定义指定方法的父类或所属模块?
检索Ruby方法所属类/模块的内置方案
核心解决方案
- 直接使用Ruby内置的
Method#owner即可快速获取方法定义所属的类或模块,完全不受元编程逻辑、模块动态混入的影响:
针对你提到的实例a,调用a.method(:some_method).owner就会直接返回定义some_method的类/模块对象。 - 如果需要直接定位到方法的源码文件和行号,搭配使用
Method#source_location:
调用a.method(:some_method).source_location会返回[文件路径, 行号]数组,绝大多数通过define_method、class_eval等常规元编程手段定义的方法都能准确返回源码位置,只有完全运行时动态生成无对应源码的方法才会返回nil。
扩展使用场景
- 类方法的查询逻辑和实例方法完全一致,例如查询类
A的类方法some_class_method的定义方:A.method(:some_class_method).owner - 如果需要查询继承/混入链上的同名重载方法定义,可以递归调用
#super_method:a.method(:some_method).super_method&.owner - 要查看类的完整方法查找优先级顺序,可以直接输出类的继承链:
A.ancestors
示例代码
# 模拟元编程混入的场景 module BusinessMixin def some_method "来自动态混入模块的实现" end end class A include BusinessMixin end a = A.new p a.method(:some_method).owner # 输出 => BusinessMixin p a.method(:some_method).source_location # 输出 => ["demo.rb", 3]
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

