我有一种情况,我必须在加载类后加载我的模块。下面是示例代码
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
模块。有人可以帮我打电话而不改变代码的顺序吗?
答案 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