查找模块中可用的类

jos*_*xls 70 ruby metaprogramming

我有一个模块MyModule.我动态地将类加载到其中.如何获取其命名空间中定义的类的列表?

例:

def load_plugins
  Dir.glob(File.dirname(__FILE__) + '/plugins/*.rb') do |f|
    MyModule.class_eval File.read(f)
  end

  # now how can I find the new classes I've loaded into MyModule?
end
Run Code Online (Sandbox Code Playgroud)

我应该说每个都f包含类似"类Foo;结束"的内容.

您也可以这样想:在Rails中,我如何以编程方式查找ActiveRecord模块中定义的所有类?

Chu*_*uck 119

通过常量访问类.模块中定义的类在该模块中列为常量.所以你只需要选择引用类的常量.

MyModule.constants.select {|c| MyModule.const_get(c).is_a? Class}
Run Code Online (Sandbox Code Playgroud)

  • 一件事:为什么你使用该测试而不是"MyModule.const_get(c).is_a?Class"?我不熟悉那样使用"===". (7认同)
  • _Avoid显式使用case相等运算符`===`.顾名思义,它意味着由`case`表达式隐式使用,在它们之外它会产生一些非常令人困惑的代码.[[样式指南](https://github.com/bbatsov/ruby-style-guide#无区分平等)] (6认同)
  • 这仅适用于已加载的模块. (6认同)
  • 没有令人信服的理由.===版本对我来说更具可读性.使用is_a?也会起作用. (3认同)