2013-04-06 48 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 
相關問題