Я пытаюсь найти все подклассы определенного типа названными Command
в Ruby, и я столкнулся со следующим кодом, который добился цели отлично, однако я действительно не понимаю, как он работает, главным образом class << [Subtype]
часть. Я попытался читать на этом, но я чувствую, что существует все еще некоторое волшебство Ruby, которое я пропускаю. Может кто-то объяснять это мне :-)
ObjectSpace.enum_for(:each_object, class << Command; self; end).to_a()
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
.