2013-04-06 71 views
3

有没有办法获得所有定义的类的列表。我在寻找这样的代码:我如何获得所有定义的类?

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] 

回答

1
p ObjectSpace.each_object(Class){|ob| p ob} 
+0

你的第一个解决方案将不起作用,因为'constants'返回一个符号数组,而不是实际的常量。 – 2013-04-06 16:06:31

+0

我知道'常量'具有什么功能,但你似乎不知道。 'Object.constants.grep(类).empty? #=> true',因此你的'each'是无用的。 – 2013-04-06 16:17:11

+0

'ob'将永远不会成为Class的一个实例。这意味着你在列表中包含了不是类的东西,因为你从不过滤它们。我不想粗鲁,但是你指着我的文档显示你所做的并不像你期望的那样工作。 – 2013-04-06 16:19:43

3

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

ObjectSpace.each_object(Class) 
+2

但是,它也会返回曾经被定义但不再有,但尚未被垃圾收集的类。 – 2013-04-06 15:35:48

2

除了ObjectSpace,您可以定义智能钩的方法是inherited,其中红宝石将调用每一个它的类的子类时。

class A 
    @sub_classes = [] 

    def self.inherited(sub_class) 
    @sub_classes << sub_class 
    end 
end 
相关问题