有没有办法获得所有定义的类的列表。我在寻找这样的代码:我如何获得所有定义的类?
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