如何获取Ruby中的命名空间中的所有类名?
我有一个模块Foo
,它是Foo::Bar
, Foo::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的(类)