代码之家  ›  专栏  ›  技术社区  ›  Sławosz

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

  •  45
  • Sławosz  · 技术社区  · 14 年前

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

    是否有方法返回命名空间为的所有类名 ?

    4 回复  |  直到 9 年前
        1
  •  54
  •   Matt Briggs    11 年前
    Foo.constants
    

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

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

    如果需要类和模块名称,可以使用 is_a? Module 而不是 is_a? Class .

        2
  •  32
  •   Jörg W Mittag    14 年前

    如果,而不是 姓名 在常量中,您需要类本身,可以这样做:

    Foo.constants.map(&Foo.method(:const_get)).grep(Class)
    
        3
  •  12
  •   Pikachu    13 年前

    这将只返回给定命名空间下的已加载常量,因为Ruby使用了惰性加载方法。 所以,如果你打字

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

    你会得到

    []
    

    但打字后:

    Foo::Bar
    

    你会得到

    [:Bar]
    
        4
  •  10
  •   Silverdev    11 年前

    简言之,没有。但是,您可以显示所有已加载的类。 因此,首先必须加载命名空间中的所有类文件:

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

    然后您可以使用类似J_¶RG W Mittag的方法列出类

    foo.constants.map(&foo.method(:const_get)).grep(类)