2011-03-24 12 views
5

पर प्रतिबिंबित करें मैं एक नेस्टेड नेमस्पेस की रूट क्लास/मॉड्यूल को खोजने का प्रयास कर रहा हूं।नेस्टेड नेमस्पेस

क्या यह खोजने के लिए यह सबसे प्रभावी तरीका है? मुझे यह पसंद नहीं है कि मैं एक स्ट्रिंग में बदल रहा हूं। ऐसा लगता है कि एक और अधिक सुरुचिपूर्ण समाधान होना चाहिए।

class Foo 
    class Bar 
    def parent 
     Object.const_get self.class.to_s.split(/::/).first 
    end 
    end 
end 

Foo::Bar.new.parent #=> Foo 

उत्तर

7

वहाँ Module.nesting

module Foo 
    module Bar 
    module Baz 
     p Module.nesting  # => [Foo::Bar::Baz, Foo::Bar, Foo] 
     p Module.nesting.last # => Foo 
    end 
    end 
end 
+0

कमाल है, आपको बहुत बहुत धन्यवाद। –

+0

@sawa निम्नलिखित काम क्यों नहीं करता है? 'Foo :: Bar :: Baz.class_eval {Module.nesting} # => [] 'और न ही' Foo :: Bar :: Baz.module_eval {Module.nesting} # => [] 'और न ही' Foo :: Bar। instance_eval {Module.nesting} # => [] ' – rudolph9

+0

@ rudolph9 'घोंसले' विधि '__dir__',' बाध्यकारी 'जैसी कुछ विधियों में से एक है, जहां शाब्दिक वातावरण महत्वपूर्ण है। आप इसे अन्य निर्माणों के साथ प्रतिस्थापित नहीं कर सकते हैं भले ही वे आमतौर पर समकक्ष हों। – sawa

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