如何获取Ruby中的命名空间中的所有类名?

我有一个模块Foo ,它是Foo::BarFoo::Baz等许多类的命名空间。

有一种方法可以返回所有由Foo命名的类名吗?

 Foo.constants 

返回Foo所有常量。 这包括但不限于类名。 如果你只想要类名,你可以使用

 Foo.constants.select {|c| Foo.const_get(c).is_a? Class} 

如果你想要类和模块的名字,你可以使用is_a? Module is_a? Module而不是is_a? Class is_a? Class

如果,而不是常量的名称 ,你想要这些类本身,你可以这样做:

 Foo.constants.map(&Foo.method(:const_get)).grep(Class) 

这只会返回给定名称空间下的加载常量,因为ruby使用延迟加载方法。 所以,如果你input

 Foo.constants.select {|c| Foo.const_get(c).is_a? Class} 

你会得到

 [] 

但input后:

 Foo::Bar 

你会得到

 [:Bar] 

总之没有。 但是,您可以显示所有已加载的类。 所以首先你必须加载名字空间中的所有类文件:

 Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file} 

那么你可以使用像JörgW Mittag's这样的方法来列出这些类

Foo.constants.map(Foo.method(:const_get))。grep的(类)