2012-03-24 10 views
5

यदि आपके पास:आप मॉड्यूल के भीतर सभी मॉड्यूल और कक्षाओं को कैसे प्राप्त करते हैं, पुनरावर्ती?

module A 
    class B 
    end 
end 

आप A.constants के माध्यम से बी और इसी तरह के वर्गों पा सकते हैं। हालांकि, रूबी 1.9.3 में, यदि आप किसी अन्य मॉड्यूल के भीतर हैं तो आप बी नहीं प्राप्त कर सकते हैं। रूबी 1.8.7 में आप कर सकते हैं।

module A 
    module Aa 
    class B 
    end 
    end 
end 

आप ए के पहले स्तर से बी कैसे प्राप्त करते हैं? क्या मैं आउटपुट के रूप में चाहते हैं स्थिरांक है, जो बी की तरह सभी वर्गों में शामिल की एक सरणी है, लेकिन मॉड्यूल ए के भीतर कहीं भी

+0

क्या मतलब है कि आप बी नहीं प्राप्त कर सकते हैं? मैं ए :: एए :: बीन्यू बना सकता हूं, यह – megas

+0

काम करता है 'MyModule.constants.select {| c | कक्षा === MyModule.const_get (सी)} 'आपके लिए काम? http://stackoverflow.com/questions/833125/find-classes- उपलब्ध-in-a- मॉड्यूल – ScottJShea

+1

हां, आप इसे तुरंत चालू कर सकते हैं। लेकिन आप प्रतीकों की एक सरणी कैसे पॉप्युलेट करेंगे, जो बी जैसे वर्गों को सूचीबद्ध करता है? स्कॉट: यह रूबी 1.9.3 के लिए काम नहीं करेगा (यह रूबी 1.8.7 के लिए होगा)। कॉन्स्टेंट्स में किसी कारण से मॉड्यूल शामिल नहीं होते हैं। – Jade

उत्तर

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

+1

ठंडा। धन्यवाद! FYI करें। http://www.ruby-doc.org/core-2.0.0/Module.html#method-i-const_get – Juguang

+0

@ जुगुंग रूबी 2.0 लगता है। http://ruby-doc.org/core-1.9.3/Module.html#method-i-const_get – Reactormonk

संबंधित मुद्दे