[英]How to get all class names in a namespace in 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使用延迟加载方法。 所以,如果你输入
Foo.constants.select {|c| Foo.const_get(c).is_a? Class}
你会得到
[]
但输入后:
Foo::Bar
你会得到
[:Bar]
总之没有。 但是,您可以显示已加载的所有类。 首先,您必须在命名空间中加载所有类文件:
Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file}
然后你可以使用像JörgWMittag这样的方法来列出类
Foo.constants.map(Foo.method(:const_get))。grep的(类)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.