【问题标题】:How do you list included Modules in a Ruby Class?如何列出 Ruby 类中包含的模块?
【发布时间】:2011-03-30 03:23:16
【问题描述】:

如何列出 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]

【问题讨论】:

    标签: ruby metaprogramming module


    【解决方案1】:

    据我了解您的问题,您正在寻找类似这样的内容:

    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 中但在 @ 987654325@?相反,为什么Kernel 被列为包含模块,即使它与SomeModule 在祖先链中一样多?该方法的布尔参数是什么意思?

    (请注意,布尔参数是总是糟糕的设计:一个方法应该只做一件事。如果它接受一个布尔参数,根据定义它会做两件事,一件如果一个论点是真的,另一个是这个论点是假的。或者,如果它只做一件事,那么这只能意味着它忽略了它的论点,在这种情况下它不应该从它开始。)

    【讨论】:

    • 我不是原始发帖人,但我想我可以回答您的问题:布尔参数。 Lance 期望这个.included_modules 方法的行为类似于#methods#public_methods 和其他类似方法在Ruby 中的行为。在那些上面,true 值的意思是“告诉我这个对象从它的类中获得的方法,以及它从它的祖先类和包含的模块中获得的方法”。 false 值不会返回这些附加方法。
    猜你喜欢
    • 2015-02-10
    • 2013-10-28
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多