我有一个mixin,我想获得包含它的所有类的列表.在mixin模块中,我做了以下事情:
module MyModule
def self.included(base)
@classes ||= []
@classes << base.name
end
def self.classes
@classes
end
end
class MyClass
include MyModule
end
Run Code Online (Sandbox Code Playgroud)
这非常有效:
> MyModule.classes #=> nil
> MyClass.new #=> #<MyClass ...>
> MyModule.classes #=> ["MyClass"]
Run Code Online (Sandbox Code Playgroud)
现在,我想将这部分提取到一个单独的模块中,该模块可以包含在我的其他mixins中.所以,我想出了以下内容:
module ListIncludedClasses
def self.included(base)
p "...adding #{base.name} to #{self.name}.classes"
@classes ||= []
@classes << base.name
base.extend(ClassMethods)
end
def self.classes
@classes
end
module ClassMethods
def included(module_base)
p "...adding #{module_base.name} to #{self.name}.classes"
@module_classes ||= []
@module_classes << module_base.name
super(module_base)
end
def classes
@module_classes
end
end …Run Code Online (Sandbox Code Playgroud)