2010-06-27 6 views
6

Je suis en train de trouver toutes les sous-classes d'un certain type appelé Command en Ruby, et je suis tombé sur le code suivant qui a fait l'affaire parfaitement, mais je ne comprends pas vraiment comment cela fonctionne, principalement class << [Subtype] partie. J'ai essayé de lire à ce sujet, mais je sens qu'il y a encore de la magie Ruby qui me manque. Quelqu'un peut-il s'il vous plaît me l'expliquer :-)confusion Ruby

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

Répondre

5

class << Command; self; end retourne la classe singleton de Command. C'est la classe que Command est la seule instance (directe) de.

Dans ruby, la classe singleton d'une sous-classe de C est une sous-classe de la classe singleton de C. Donc, toutes les sous-classes de Command ont des classes singleton qui héritent de la classe singleton de Command.

ObjectSpace.each_object(C) d'effectuer une itération sur tous les objets qui sont des instances de la classe C ou l'une de ses sous-classes. Donc en faisant ObjectSpace.each_object(singleton_class_of_command) vous itérez sur Command et toutes ses sous-classes.

Le bit enum_for renvoie un élément Enumerable qui énumère tous les éléments dont each_object effectue l'itération, vous pouvez donc le transformer en un tableau avec to_a.

+0

Explication brillante, merci! Donc, c'est essentiellement la même chose: commands = [] ObjectSpace.each_object (class << Command; self; end) {| c | commandes << c} il semble vraiment simple maintenant, j'aurais dû être capable de travailler ça :) – amarsuperstar