79

モジュールがあります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

fそれぞれに「class Foo; end」のようなものが含まれていると言わざるを得ません。

次のように考えることもできます。Rails では、ActiveRecord モジュール内で定義されているすべてのクラスをプログラムで見つけるにはどうすればよいでしょうか?

4

3 に答える 3

137

クラスには定数を介してアクセスします。モジュール内で定義されたクラスは、そのモジュール内の定数としてリストされます。したがって、クラスを参照する定数を選択するだけです。

MyModule.constants.select {|c| MyModule.const_get(c).is_a? Class}
于 2009-05-07T06:36:54.070 に答える
4

レールを使用している場合、定数が表示されるようにするには、最初に定数にアクセスする必要があります。これは、定数が遅延ロードされるためです。

MyModule::NotAClass = "not a class"

MyModule.constants => [:NotAClass]

MyModule::AClass => :AClass # Access class for it to be autoloaded

MyModule.constants => [:AClass, :NotAClass]

# Now, select the constants which are class instances

MyModule.constants
        .map(&MyModule.method(:const_get))
        .select { |constant| constant.is_a? Class} 

 => [MyModule::AClass]**
于 2019-11-06T14:41:22.323 に答える