Ruby enum_ для путаницы - PullRequest
6 голосов
/ 27 июня 2010

Я пытаюсь найти все подклассы определенного типа с именем Command в Ruby, и я наткнулся на следующий код, который отлично справился с задачей, однако я не очень понимаю, как он работает, в основном class << [Subtype] часть. Я попытался прочитать об этом, но я чувствую, что есть еще какая-то магия Руби, которой мне не хватает. Может кто-нибудь, пожалуйста, объясните мне это: -)

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

1 Ответ

5 голосов
/ 27 июня 2010

class << Command; self; end возвращает одноэлементный класс Command.Это тот класс, для которого Command является единственным (прямым) экземпляром.

В ruby ​​синглтон-класс подкласса C является подклассом синглтон-класса C.Таким образом, все подклассы Command имеют одноэлементные классы, которые наследуются от одноэлементного класса Command.

ObjectSpace.each_object(C) выполняет итерации по всем объектам, которые являются экземплярами класса C или одного из его подклассов.Таким образом, делая ObjectSpace.each_object(singleton_class_of_command), вы перебираете Command и все ее подклассы.

Бит enum_for возвращает Enumerable, который перечисляет все элементы, которые перебирает each_object, поэтому вы можете превратить его в массив сto_a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...