Ruby模块级方法覆写的工作原理及多次包含模块后方法所有者异常的原因咨询
Ruby模块级方法覆写的工作原理及多次包含模块后方法所有者异常的原因咨询
嘿,我遇到了一个关于Ruby模块扩展方法的奇怪问题,想请大家帮忙理清楚背后的逻辑。先给大家看一下我用的代码(注意我没法控制模块A的实现):
module A def self.included(base) base.extend ClassMethods end module ClassMethods def singleton_test end end end module B def self.included(base) base.extend ClassMethods end module ClassMethods def self.extended(base) puts base.method(:singleton_test).owner define_method(:singleton_test) do |*args, &blk| super(*args, &blk) end end end end
我做了两次测试:
- 第一次包含:
输出结果是class C include A include B endA::ClassMethods - 第二次包含:
输出结果变成了class D include A include B endB::ClassMethods
虽然super调用还是能正确路由到模块A的原方法,但我搞不懂为什么第二次包含的时候,singleton_test方法就已经被B给“包装”过了,方法所有者直接变成了B的ClassMethods模块。我自己琢磨了个理论:是不是因为模块B重定义singleton_test的时候,其实是在模块A的级别上修改了这个方法?这样后面任何包含模块A的类,拿到的都是已经被B包装过的版本?
备注:内容来源于stack exchange,提问作者ohhh
相关产品推荐
相关产品推荐

