您如何列出Ruby中类层次结构中特定类中包含的模块?像这样:
module SomeModule
end
class ParentModel < Object
include SomeModule
end
class ChildModel < ParentModel
end
p ChildModel.included_modules #=> [SomeModule]
p ChildModel.included_modules(false) #=> []
列出祖先会使模块在树中显得更高:
p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel]
答案 0 :(得分:18)
据我了解你的问题,你正在寻找这样的东西:
class Class
def mixin_ancestors(include_ancestors=true)
ancestors.take_while {|a| include_ancestors || a != superclass }.
select {|ancestor| ancestor.instance_of?(Module) }
end
end
但是,我并不完全了解您的测试用例:为什么SomeModule
被列为ChildModel
的包含模块,即使它 实际包含在ChildModel
中ParentModel
1}}但在Kernel
?相反,为什么SomeModule
不列为包含模块,即使它在祖先链中与{{1}}一样多?那个方法的布尔参数是什么意思?
(注意布尔参数总是设计不好:一个方法应该做一件事。如果它采用布尔参数,它按照定义两个的东西,一个如果参数是真的,另一个是参数是假的。或者,如果它只做一件事,那么这只能意味着它忽略了它的参数,在这种情况下它不应该从它开始。)