【问题标题】:How to get all class names in a namespace in Ruby?如何在 Ruby 中获取命名空间中的所有类名?
【发布时间】:2010-09-09 11:56:41
【问题描述】:

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

有没有办法返回以Foo命名的所有类名?

【问题讨论】:

    标签: ruby


    【解决方案1】:
    Foo.constants
    

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

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

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

    【讨论】:

    • 这是一个很好的答案。有时你有点忘记了 ruby​​ 中的常量是以大写开头的任何东西,所以类名是类型类的常量实例。 +1
    • @jcaudle Ruby 延迟加载类。您正在考虑 Rails。
    • 确保你之前加载了所有的类:Dir["app/models/foo/*.rb"].each {|file| load file}
    • @espinchi 在提供特定于 Rails 的建议时,最好这样说。否则可能会使人感到困惑。
    • 这仅适用于之前已加载的类。
    【解决方案2】:

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

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

    【讨论】:

    • 喜欢无点编程。我的 Haskell 显示出来了吗?
    • 我会为这个答案给你买啤酒!
    • 这个答案是最好的,但确保它被定义可以防止诸如 Module::MODULES Module.constants.select(&Module.method(:const_defined?)).map(&Module.method(:const_get)).grep(Class) 之类的崩溃
    【解决方案3】:

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

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

    那么您可以使用 Jörg W Mittag 之类的方法来列出类

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

    【讨论】:

    • 如果您在运行时检查模块,这种方法会出现问题
    • 这是唯一正确的答案,因为它忽略了自动加载器的工作原理!
    【解决方案4】:

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

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

    你会得到

    []
    

    但是在输入之后:

    Foo::Bar
    

    你会得到

    [:Bar]
    

    【讨论】:

    • 确保在加载所有类之前: Dir["app/models/foo/*.rb"].each {|file|加载文件}
    【解决方案5】:

    此替代解决方案将加载并显示Foo:: 下的所有 类,包括“嵌套”类,例如Foo::Bar::Bar.

    Dir["#{File.dirname(__FILE__)}/lib/foo/**/*.rb"].each { |file| load file }
    ObjectSpace.each_object(Class).select { |c| c.to_s.start_with? "Foo::" }
    

    注意:**/*.rb 递归全局。

    如果您想包含 Foo 类本身,您可以将您的 select 更改为例如{ |c| c.to_s =~ /^Foo\b/ }

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 2012-02-18
      • 2014-05-10
      • 2011-06-21
      • 2020-01-26
      • 2011-08-12
      相关资源
      最近更新 更多