Ruby enum_for беспорядок

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

ObjectSpace.enum_for(:each_object, class << Command; self; end).to_a()
6
задан amarsuperstar 27 June 2010 в 11:32
поделиться

1 ответ

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.

5
ответ дан 17 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: