2012-03-24 67 views
5

如果您有:如何以遞歸方式查找模塊中的所有模塊和類?

module A 
    class B 
    end 
end 

您可以通過A.constants找到B和相似的類。但是,在Ruby 1.9.3中,如果它位於另一個模塊中,則不能獲得B.在Ruby 1.8.7中,你可以。

module A 
    module Aa 
    class B 
    end 
    end 
end 

如何從A的第一級獲得B?我想作爲輸出爲常數,其中包括像B中的所有類的數組,但模塊A內的任何地方,如果你確實有圓形的命名空間

+0

你是什麼意思,你不能得到乙?我可以使A :: Aa :: B.new,它的工作原理是 – megas 2012-03-24 00:51:40

+0

'MyModule.constants.select {| c | Class === MyModule.const_get(c)}'爲你工作? http://stackoverflow.com/questions/833125/find-classes-available-in-a-module – ScottJShea 2012-03-24 01:28:29

+1

是的,你可以直接實例化它。但是,如何填充一個符號列表,其中列出了像B這樣的類? Scott:這對Ruby 1.9.3不適用(對於Ruby 1.8.7而言)。由於某些原因,常量不包含模塊。 – Jade 2012-03-24 15:22:41

回答

12
class Module 
    def all_the_modules 
    [self] + constants.map {|const| const_get(const) } 
     .select {|const| const.is_a? Module } 
     .flat_map {|const| const.all_the_modules } 
    end 
end 

A.all_the_modules 
# => [A, A::Aa, A::Aa::B] 

該代碼將打破,又名 A::Aa::B.const_set(:A, A)

+0

太棒了,謝謝! – Jade 2012-03-26 16:33:33

+1

很酷。謝謝!僅供參考。 http://www.ruby-doc.org/core-2.0.0/Module.html#method-i-const_get – Juguang 2013-12-12 11:38:32

+0

@Juguang似乎是紅寶石2.0。 http://ruby-doc.org/core-1.9.3/Module.html#method-i-const_get – Reactormonk 2013-12-15 00:34:37