Ruby enum_for混乱

ama*_*tar 6 ruby

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

ObjectSpace.enum_for(:each_object, class << Command; self; end).to_a()
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 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)迭代命令及其所有子类.

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