2009-05-07 72 views
57

我有一個模塊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包含有類似 「類Foo;結束」。

你也可以這樣想:在Rails中,我怎樣才能以編程方式查找在ActiveRecord模塊中定義的所有類?

回答

98

類通過常量訪問。在模塊中定義的類在該模塊中被列爲常量。所以你只需要選擇引用類的常量。

MyModule.constants.select {|c| MyModule.const_get(c).is_a? Class} 
+1

太棒了。謝謝。 – joshuaxls 2009-05-07 06:51:25

+7

有一件事:爲什麼你使用該測試而不是「MyModule.const_get(c).is_a?Class」?我不熟悉如此使用「===」。 – joshuaxls 2009-05-07 06:57:26

+3

沒有令人信服的理由。 ===版本對我來說更具可讀性。使用is_a?也會工作。 – Chuck 2009-05-07 07:04:54