假设我们有这段代码:
module A
def n1
puts 'n1'
end
module AA
def n2
puts 'n2'
end
end
end
class B
include A
end
B.new.n1
B.new.n2
最后一行不起作用,除非我做的事情包括A:AA,或者这个:
def self.included(base)
base.include AA
end
但是有没有其他(更方便)的方法来包含或引用子模块而没有明确地将它们包含在::或self.included中?
答案 0 :(得分:1)
要在n1
中添加方法n2
和class B
,您可以:
include A::AA
添加到类定义或include AA
定义中添加module A
, <{1}}定义后 ,但是更有意义的是:
module AA
定义移出module AA
定义并将module A
添加到类定义中,或include AA
之前定义module AA
,并将module A
添加到include AA
定义。 答案 1 :(得分:0)
重新定义Module
类':include
方法,如下所示,您可以包含递归模块:
class Module
alias :include_orig :include
def include mod, options = {}
mod.constants.each do| const |
c = A.const_get const
self.include c, options if c.is_a? Module
end if options[ :recursive ]
self.send :include_orig, mod
end
end
然后致电:
class B
include A, :recursive => true
end
B.new.n1
B.new.n2
# n1
# n2