我有一个像这样的模块
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
也没有。我尝试移动include
或extend
以及常量如何引用。我在这里缺少什么?
答案 0 :(得分:2)
我希望我理解你想要的东西。我将module A
和module 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
或其他任何内容。如您所见,extend
和Module A
都不使用这些关键字,它们都只定义Module B
。
当然,只要您使用ClassMethods
的方法b,就必须包含module A
,否则对module B
的方法调用将失败。您也可以在a
内include A::ClassMethods
进行B::ClassMethods
,这样您只需include B
内的Klass
。
答案 1 :(得分:1)
在模块extend A
的{{1}}回调中添加included
操作,而不是将其添加到B
定义中,如下面的代码所示:
ClassMethod