You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    end
    
    输出结果是A::ClassMethods
  • 第二次包含:
    class D
      include A
      include B
    end
    
    输出结果变成了B::ClassMethods

虽然super调用还是能正确路由到模块A的原方法,但我搞不懂为什么第二次包含的时候,singleton_test方法就已经被B给“包装”过了,方法所有者直接变成了B的ClassMethods模块。我自己琢磨了个理论:是不是因为模块B重定义singleton_test的时候,其实是在模块A的级别上修改了这个方法?这样后面任何包含模块A的类,拿到的都是已经被B包装过的版本?

备注:内容来源于stack exchange,提问作者ohhh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:09:33