如何确定Rails中super()调用的目标类?调试方法咨询
确定Ruby中super调用的目标方法
以下是几个精准且优雅的方法,帮你定位super()的下一个调用目标:
1. 使用super_method直接查询(最推荐)
在Pry断点处,直接执行以下命令,就能获取super要调用的方法对象:
method(:initialize).super_method
执行后会返回类似#<Method: SalesOrder(Object)#initialize>的结果,其中括号里的Object就是super要调用的类/模块。
这个方法是Ruby原生提供的,直接对应方法查找链的下一个节点,结果完全准确。
2. 结合祖先链验证
Ruby的方法查找是按照类祖先链的顺序进行的,你可以先查看当前类的完整祖先链:
self.class.ancestors
然后从ActiveModel::API之后的第一个祖先开始,检查哪个类/模块实现了initialize方法——这就是super的调用目标。不过这个方法需要手动验证,不如super_method直接高效。
为什么included_modules不够准确?
self.class.included_modules仅列出当前类包含的模块,但方法查找链还包含父类(比如Object),而且模块的包含顺序和实际方法查找的优先级不一定完全匹配,所以无法直接通过它确定super的调用目标。
内容的提问来源于stack exchange,提问作者timpone
相关产品推荐
相关产品推荐

