有沒有辦法獲得所有定義的類的列表。我在尋找這樣的代碼:我如何獲得所有定義的類?
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]
有沒有辦法獲得所有定義的類的列表。我在尋找這樣的代碼:我如何獲得所有定義的類?
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]
p ObjectSpace.each_object(Class){|ob| p ob}
ObjectSpace可以幫助您獲取類的所有實例。因此,這將返回所有定義的類
ObjectSpace.each_object(Class)
但是,它也會返回曾經被定義但不再有,但尚未被垃圾收集的類。 – 2013-04-06 15:35:48
除了ObjectSpace
,您可以定義智能鉤的方法是inherited
,其中紅寶石將調用每一個它的類的子類時。
class A
@sub_classes = []
def self.inherited(sub_class)
@sub_classes << sub_class
end
end
你的第一個解決方案將不起作用,因爲'constants'返回一個符號數組,而不是實際的常量。 – 2013-04-06 16:06:31
我知道'常量'具有什麼功能,但你似乎不知道。 'Object.constants.grep(類).empty? #=> true',因此你的'each'是無用的。 – 2013-04-06 16:17:11
'ob'將永遠不會成爲Class的一個實例。這意味着你在列表中包含了不是類的東西,因爲你從不過濾它們。我不想粗魯,但是你指着我的文檔顯示你所做的並不像你期望的那樣工作。 – 2013-04-06 16:19:43