繁体   English   中英

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

[英]How to get all class names in a namespace in 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使用延迟加载方法。 所以,如果你输入

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM