Ruby enum_for混乱

时间:2010-06-27 11:32:31

标签: ruby

我试图在Ruby中找到一个名为Command的类型的所有子类,我遇到了以下代码,这些代码完美地完成了这个技巧,但我真的不明白它是如何工作的,主要是class << [Subtype]部分。我已经尝试过阅读,但我觉得还有一些我不知道的Ruby魔法。有人可以向我解释一下: - )

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

1 个答案:

答案 0 :(得分:5)

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

在ruby中,C的子类的singleton类是C的singleton类的子类。因此,Command的所有子类都具有从Command的单例类继承的单例类。

ObjectSpace.each_object(C)遍历作为类C或其子类之一的所有对象。因此,通过执行ObjectSpace.each_object(singleton_class_of_command),您可以遍历Command及其所有子类。

enum_for位返回一个Enumerable,它枚举each_object迭代的所有元素,因此您可以将其转换为to_a的数组。