在另一个具有相同名称的模块中使用模块

时间:2014-03-17 22:24:41

标签: ruby

我有一个像这样的模块

module A
  module ClassMethods
    def a
      "a"
    end
    def b
      a
    end
  end
  def self.included(klass)
    klass.extend ClassMethods
  end
end

我想将b纳入其自己的模块,因为B显然不是A s。 b方法取决于A,我希望A中定义的方法可供B使用。

这样做:

module B
  module ClassMethods
    extend A
    def b
      a
    end
  end
  def self.included(klass)
    klass.extend(ClassMethods)
  end
end

它不起作用。 include也没有。我尝试移动includeextend以及常量如何引用。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

我希望我理解你想要的东西。我将module Amodule B分开。当我在新课程Klass中包含这些内容时,我可以访问方法a和方法b,而来自b的方法module B取决于方法{来自a的{​​1}}:

module A

据我了解,您可以在不同的地方定义相同的模块,无需说module A module ClassMethods def a "a" end end def self.included(klass) klass.extend(ClassMethods) end end module B module ClassMethods # include A::ClassMethods here and you can do only 'include B' inside Klass def b "Called from B: %s" % a end end def self.included(klass) klass.extend(ClassMethods) end end class Klass include A, B end p Klass.a # => "a" p Klass.b # => "Called from B: a" include或其他任何内容。如您所见,extendModule A都不使用这些关键字,它们都只定义Module B

当然,只要您使用ClassMethods的方法b,就必须包含module A,否则对module B的方法调用将失败。您也可以在ainclude A::ClassMethods进行B::ClassMethods,这样您只需include B内的Klass

答案 1 :(得分:1)

在模块extend A的{​​{1}}回调中添加included操作,而不是将其添加到B定义中,如下面的代码所示:

ClassMethod