2010-06-27 73 views
6

我想在Ruby中找到某种类型的所有子类,称为Command,并且我遇到了下面的代码,它完美地实现了这个技巧,但是我并不真正了解它是如何工作的,主要是class << [Subtype]部分。我曾试着读过这本书,但我觉得还有一些我失踪的Ruby魔法。是否有人可以给我讲解一下:-)Ruby enum_for混淆

ObjectSpace.enum_for(:each_object, class << Command; self; end).to_a() 

回答

5

class << Command; self; end返回单一类的Command。这是Command是唯一(直接)实例的类。

在ruby中,C的子类的单例类是C的单例类的子类。所以Command的所有子类都有从Command的单例类继承的单例类。

ObjectSpace.each_object(C)遍历作为类C或其某个子类的实例的所有对象。所以通过做ObjectSpace.each_object(singleton_class_of_command)你遍历命令及其所有的子类。

enum_for位返回一个Enumerable枚举each_object迭代的所有元素,因此您可以将它变成一个包含to_a的数组。

+0

明智的解释,谢谢!所以它基本上与此相同: commands = [] ObjectSpace.each_object(class << Command; self; end){| c |命令<< c} 现在看起来很简单,我应该能够解决这个问题:) – amarsuperstar 2010-06-27 12:19:52