如何列出Ruby类中包含的模块?

Lan*_*ard 19 ruby module metaprogramming

您如何列出Ruby中类层次结构中特定类中包含的模块?像这样的东西:

module SomeModule
end

class ParentModel < Object
  include SomeModule
end

class ChildModel < ParentModel
end

p ChildModel.included_modules #=> [SomeModule]
p ChildModel.included_modules(false) #=> []
Run Code Online (Sandbox Code Playgroud)

列出祖先会使模块在树中显得更高:

p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel]
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 19

据我了解你的问题,这是你正在寻找的东西:

class Class
  def mixin_ancestors(include_ancestors=true)
    ancestors.take_while {|a| include_ancestors || a != superclass }.
    select {|ancestor| ancestor.instance_of?(Module) }
  end
end
Run Code Online (Sandbox Code Playgroud)

不过,我不完全理解你的测试用例:为什么SomeModule列为包含的模块ChildModel,即使它没有真正纳入ChildModel但在ParentModel?相反,为什么Kernel 列为包含模块,即使它在祖先链中也同样如此SomeModule?那个方法的布尔参数意味着什么?

(注意布尔参数总是糟糕的设计:一个方法应该完成一件事.如果它采用一个布尔参数,它定义了两个东西,一个如果参数为真,另一个是参数是假.或者,如果它只做一件事,那么这只能意味着它忽略了它的论点,在这种情况下它不应该从它开始.)