Ruby加载后包含链模块

时间:2018-05-15 13:45:03

标签: ruby-on-rails 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中包含Ab模块。有人可以帮我打电话而不改变代码的顺序吗?

2 个答案:

答案 0 :(得分:0)

为什么将A加入B,而不加入Ab?这可行:

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

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

旁注: Module#include是公开的。

答案 1 :(得分:0)

您可以在模块A中添加模块B

module A
  def method_a
    puts "Method_a"
  end
end

module B
  include A

  def method_b
    puts "Method_b"
  end
end

class Ab
  include B

  def calltest
    method_a
    method_b
  end
end

Ab.new.calltest
# Method_a
# Method_b
#=> nil