2011-10-19 16 views
35

तो Module रूबी में इस्तेमाल किया जा सकता mixins के अलावा नेमस्पेसिंग प्रदान करने के लिए है, तो के रूप में:इन रूबी नेमस्पेस सम्मेलनों के बीच क्या अंतर है?

module SomeNamespace 
    class Animal 

    end 
end 

animal = SomeNamespace::Animal.new 

लेकिन मैं यह भी इस्तेमाल किया निम्नलिखित देखा है:

module SomeNamespace 
end 

class SomeNamespace::Animal 

end 

animal = SomeNamespace::Animal.new 

मेरा प्रश्न है कि वे कैसे 'है फिर अलग (अगर वे हैं) और जो अधिक मूर्खतापूर्ण रूबी है?

उत्तर

37

अंतर घोंसला में निहित है।

नीचे दिए गए उदाहरण में, आप देख सकते हैं कि क्लास फू का उपयोग करने वाली पूर्व विधि, बाहरी स्कोप के स्थिर चर BAR_A त्रुटियों के बिना प्राप्त कर सकती है।

इस बीच, कक्षा बाज़ अनियमित स्थिर ए :: बी :: बाज़ :: बार_ए की त्रुटि के साथ बम होगा। चूंकि यह ए :: * निहित रूप से नहीं लाता है, केवल ए :: बी :: * स्पष्ट रूप से।

module A 
    BAR_A = 'Bar A!' 
    module B 
    BAR_B = 'Bar B!' 
     class Foo 
     p BAR_A 
     p BAR_B 
     end 
    end 
end 

class A::B::Baz 
    p BAR_A 
    p BAR_B 
end 

दोनों व्यवहारों का स्थान होता है। मेरी राय में समुदाय में कोई वास्तविक सहमति नहीं है कि एक ट्रू रूबी वे (टीएम) कौन सा है। मैं व्यक्तिगत रूप से पूर्व, ज्यादातर समय का उपयोग करता हूं।

5

दो दृष्टिकोणों के बीच एकमात्र अंतर यह है कि दूसरा नाम uninitialized constant Object::SomeNamespace फेंक देगा यदि नामस्थान पहले घोषित नहीं किया गया है।

जब एक फ़ाइल में घोषित किया गया, तो मैं पहले व्यक्ति का चयन करूंगा क्योंकि आपको SomeNamespace दोहराना नहीं है।

जब एक से अधिक फ़ाइलों का उपयोग कर मैं भी एक दूसरे का उपयोग निम्न समस्या में चल रहा से बचने के लिए: यदि आपका कोड बेस एक छोटा सा है

# in a.rb 
require 'b' 

module SomeNamespace 
    def self.animal 
    Animal.new 
    end 
end 

# in b.rb 
class SomeNamespace::Animal 

end 

# irb 
require 'a' # explodes with the uninitialized constant error 

यह उदाहरण काल्पनिक किया जा सकता है, लेकिन यह यह को गति प्रदान करने के लिए आसान है बड़ा। मैं आमतौर पर इससे बचने के लिए स्पष्ट तरीके (आपका पहला) उपयोग करता हूं।

दूसरी बात का उपयोग करते समय उपयोगी हो सकता है कि यह नामस्थान में टाइपो का पता लगाएगा।

नामस्थान बनाने के लिए एक स्थापित तरीका प्रतीत नहीं होता है, उदाहरण के लिए डेविस दोनों दृष्टिकोणों को मिश्रित करता है: first one, second one

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