2010-06-27 9 views
6

Estoy tratando de encontrar todas las subclases de un cierto tipo llamado Command en Ruby, y me encontré con el siguiente código que hizo el truco perfectamente, sin embargo, realmente no entiendo cómo funciona, principalmente el class << [Subtype] parte. Intenté leer sobre esto, pero creo que todavía hay algo de magia Ruby que me falta. Por favor alguien puede explicar esto a mí :-)Ruby enum_for confusion

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

Respuesta

5

class << Command; self; end devuelve la clase singleton de Command. Esta es la clase que Command es la única instancia (directa) de.

En ruby, la clase singleton de una subclase de C es una subclase de la clase singleton de C. Entonces, todas las subclases de Command tienen clases singleton que heredan de la clase singleton de Command.

ObjectSpace.each_object(C) itera sobre todos los objetos que son instancias de la clase C o una de sus subclases. Entonces, al hacer ObjectSpace.each_object(singleton_class_of_command) itera sobre Command y todas sus subclases.

El bit enum_for devuelve un enumerable que enumera todos los elementos que each_object itera, por lo que puede convertirlo en una matriz con to_a.

+0

¡Explicación brillante, gracias! Por lo tanto, es esencialmente lo mismo que esto: commands = [] ObjectSpace.each_object (class << Command; self; end) {| c | comandos << c} Parece realmente simple ahora, debería haber sido capaz de resolver eso :) – amarsuperstar