考虑以下Ruby类的示例,该示例包含一个定义类和实例方法的模块以及一个继承第一个类的第二个类。Ruby模块可以定义类方法,所以它们也可以在模块嵌套时工作吗?
module Z
def self.included(base)
class << base
def classmethod
puts "Hello, I'm #{__method__} in #{self}"
end
end
end
def instancemethod
puts "Hello, I'm #{__method__} in #{self}"
end
end
class A
include Z
end
class B < A
end
A.classmethod
A.new.instancemethod
B.classmethod
B.new.instancemethod
输出如预期:类和实例都具有由模块定义的方法。
Hello, I'm classmethod in A
Hello, I'm instancemethod in #<A:0x85f4c10>
Hello, I'm classmethod in B
Hello, I'm instancemethod in #<B:0x85f4968>
现在,考虑上述模块包含在另一个模块的情况下,其类别包括代替:
module Y
include Z
end
class C
include Y
end
class D < C
end
Y.classmethod
C.classmethod
C.new.instancemethod
D.classmethod
D.new.instancemethod
的实例方法的工作,但对C
和D
类的方法不(在在替代模块Y
中替代地定义了classmethod
)。
能模块Z
被修饰的,使得类的方法被添加到类C
而不是中间模块,Y
?
原始场景(即模块没有嵌套的地方)也应该继续像上面那样工作。
调用'在'module' include'那刚好碰巧包含了一些东西并不意味着你会得到'include'依赖关系来链接。将模块包含在模块中并不完全符合您期望的模块。 – tadman
你会接受一个回答吗?除了'包括Z'之外,还有其他的方法吗? – Raffael
'ActiveSupport :: Concern'可以帮助你在这里(Z和Y都必须扩展它)。这对你来说是一种选择吗? – Raffael