首页 > 解决方案 > 类加载后的Ruby包含链模块

问题描述

我有一种情况,我必须在加载类之后加载我的模块。下面是示例代码

require 'active_support/concern'
module A
  extend ActiveSupport::Concern
  def method_a
    puts "Method_a"
  end
end

module B
  extend ActiveSupport::Concern
  def method_b
    puts "Method_b"
  end
end

class Ab
  include B
  def calltest
    method_a
    method_b
  end
end

B.send(:include, A)

Ab.new.method_a
Ab.new.method_b

当我调用上面的示例时method_a,它会引发错误。但是,如果将那条线移到Ab类上方,它就可以正常工作。我不想A在 class 中包含模块Ab。有人可以在不更改代码顺序的情况下帮我打电话吗?

标签: ruby-on-railsruby

解决方案


为什么你包括Ainto B,而不是 into Ab?这会起作用:

# B.send(:include, A)
Ab.include A

您的代码不起作用,因为include B已执行并且基本上所有方法都已B添加到基础中。可以实现self.included回调B,收集它包含的所有类/模块,在其特征类上调用时更新所有这些类/模块include,但这看起来像是一种奇怪的矫枉过正。

旁注: Module#include是公开的。


推荐阅读