【问题标题】:How can I get all defined classes? [duplicate]如何获得所有定义的类? [复制]
【发布时间】:2013-04-06 15:09:17
【问题描述】:

有没有办法获取所有已定义类的列表。我正在寻找这样的代码:

Class.instances.each do |klass|
  puts klass.name
end

如果没有办法做到这一点。是否可以定义一个类 A 使其后代在其中注册?比如这样:

class A
  ...
end

class B < A
end

class C < B
end

A.descendants   # => [B, C] 

【问题讨论】:

    标签: ruby


    【解决方案1】:

    ObjectSpace 可以帮助您获取一个类的所有实例。这将因此返回所有定义的类

    ObjectSpace.each_object(Class)
    

    【讨论】:

    • 但是,它也会返回曾经定义但不再定义但尚未被垃圾回收的类。
    【解决方案2】:
    p ObjectSpace.each_object(Class){|ob| p ob}
    

    【讨论】:

    • 您的第一个解决方案行不通,因为constants 返回的是一个符号数组,而不是实际的常量。
    • 我知道constants 做了什么,但你似乎不知道。 Object.constants.grep(Class).empty? #=&gt; true,因此你的each 没用。
    • ob永远成为 Class 的实例。这意味着您在列表中包含不是类的东西,因为您从不过滤它们。我并不是要无礼,但您是在向我指出文档表明您正在做的事情没有按您的预期工作。
    • 有输出并不意味着它是正确的……它不是。
    • @AndrewMarshall 你是对的!已更新。
    【解决方案3】:

    除了ObjectSpace,您可以定义的智能钩子方法是inherited,Ruby 将在其类被子类化时调用。

    class A
      @sub_classes = []
    
      def self.inherited(sub_class)
        @sub_classes << sub_class
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2013-02-02
      • 2012-10-09
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多