将子模块包含在Ruby中的类的替代方法

时间:2013-12-29 18:50:17

标签: ruby module

假设我们有这段代码:

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中?

2 个答案:

答案 0 :(得分:1)

要在n1中添加方法n2class 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