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