Как получить все имена классов в пространстве имен в Ruby? У меня есть модуль Foo, что это пространство имен для многих классов, таких как Foo::Bar, Foo::Baz и т.д. Есть ли способ вернуть все имена классов, помеченные Foo? Ответ 1 Foo.constants возвращает все константы в Foo. Это включает в себя, но не ограничивается, имена классов. Если вы хотите только имена классов, вы можете использовать Foo.constants.select {|c| Foo.const_get(c).is_a? Class} Если вы хотите имена классов и модулей, вы можете использовать is_a? Module вместо is_a? Class. Ответ 2 Если вместо имен констант вам нужны сами классы, вы можете сделать это следующим образом: Foo.constants.map(&Foo.method(:const_get)).grep(Class) Ответ 3 Это приведет только к возврату загруженных констант в заданное пространство имен, потому что Ruby использует ленивый подход к загрузке. Итак, если вы наберете Foo.constants.select {|c| Foo.const_get(c).is_a? Class} вы получите [] но после ввода: Foo::Bar вы получите [:Bar] Ответ 4 Короче нет. Однако вы можете показать все загруженные классы. Поэтому сначала вам нужно загрузить все файлы классов в пространстве имен: Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file} то вы можете использовать метод Jörg W Mittag для перечисления классов Foo.constants.map(& Foo.method(: const_get)). Grep (класс)
Ответ 1 Foo.constants возвращает все константы в Foo. Это включает в себя, но не ограничивается, имена классов. Если вы хотите только имена классов, вы можете использовать Foo.constants.select {|c| Foo.const_get(c).is_a? Class} Если вы хотите имена классов и модулей, вы можете использовать is_a? Module вместо is_a? Class.
Ответ 2 Если вместо имен констант вам нужны сами классы, вы можете сделать это следующим образом: Foo.constants.map(&Foo.method(:const_get)).grep(Class)
Ответ 3 Это приведет только к возврату загруженных констант в заданное пространство имен, потому что Ruby использует ленивый подход к загрузке. Итак, если вы наберете Foo.constants.select {|c| Foo.const_get(c).is_a? Class} вы получите [] но после ввода: Foo::Bar вы получите [:Bar]
Ответ 4 Короче нет. Однако вы можете показать все загруженные классы. Поэтому сначала вам нужно загрузить все файлы классов в пространстве имен: Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file} то вы можете использовать метод Jörg W Mittag для перечисления классов Foo.constants.map(& Foo.method(: const_get)). Grep (класс)