2012-02-22 10 views
6

रूबी में, मुझे मॉड्यूल नाम और क्लासनाम के रूप में संदर्भित मॉड्यूल और मिश्रित समेत एक सामान्य सामान्य अभ्यास देखना शुरू हो रहा है, जहां अतीत में यह सुंदर था बस मॉड्यूलनाम :: क्लासनाम।:: मॉड्यूलनाम :: क्लासनाम और मॉड्यूलनाम :: कक्षा नाम

मैं यहां क्या प्राप्त करना चाहता हूं यह एक सभ्य समझ है कि यह अभ्यास अधिक हाल ही में क्यों देखा जा रहा है और यह अलग-अलग क्या करता है।

क्या अंतर है?

क्या लाभ है (यदि पूर्व इसका उत्तर नहीं देता है)?

आपके इनपुट के लिए अग्रिम धन्यवाद।

उत्तर

9

यदि आप शुरुआत में :: डालते हैं तो आप वैश्विक नामस्थान का जिक्र कर रहे हैं, यदि आप अपने वर्तमान नामस्थान का जिक्र नहीं कर रहे हैं।

आमतौर पर यदि आपके पास कक्षा/मॉड्यूल के अंदर एक ही नाम के साथ कक्षा/मॉड्यूल नहीं है तो आपको शुरुआत में :: का उपयोग करने की आवश्यकता नहीं होगी।

class Customer 

    def to_s 
    "Customer global" 
    end 

end 


class Order 

    class Customer 
    def to_s 
     "Customer within order" 
    end 
    end 


    def initialize 
    puts Customer.new 
    puts ::Customer.new 
    end 


end 

Order.new 

बाहर प्रिंट होगा

Customer within order 
Customer global 
+0

+1 एक साधारण उदाहरण के साथ भयानक स्पष्टीकरण के लिए +1। – nkm

2

जब आप ::ModuleName::ClassName कर तुम कह रहे हो:

मैं आप रूट नाम स्थान पर ::ModuleName::ClassName देखने के लिए चाहते हैं, अनदेखी करता है, तो इस कोड को पाया जाता है एक और मॉड्यूल के अंदर। इसलिए, यह हमेशा एक वर्ग जब आप इसे इस ModuleName::ClassName तरह का कहना है कि ::ModuleName::ClassName और बाकी

कुछ भी नहीं के रूप में नामित किया है के लिए दिखाई देगा, तुम कह रहे हो:

मैं तुम्हें ModuleName::ClassName लेकिन तलाश के लिए देखने के लिए चाहते हैं वर्तमान दायरे में पहले और फिर अन्य क्षेत्रों में। इसलिए, यदि आपके पास MyModule नामक एक मॉड्यूल है और यह मेरा मॉड्यूल ModuleName::ClassName संदर्भित करता है तो पहले MyModule::ModuleName::ClassName खोजने का प्रयास करें, तो ::ModuleName::ClassName को हल करने का प्रयास करें।

जब मैं इस तरह के कोड को परिभाषित कर रहा हूं तो मैं लगभग किसी भी नामकरण विवाद से बचने के लिए लगभग हमेशा :: मॉड्यूलनाम :: क्लासनाम का उपयोग करता हूं।

+0

दिलचस्प, तो मुझे लगता है कि आप इसे किसी भी तरह से उपयोग कर सकते हैं। यह सत्यापित करने के लिए :: आपके पास नामकरण समस्याएं नहीं हैं, और यदि कोई ऐसी स्थिति है जो नामकरण संघर्ष का कारण बनती है तो कुछ भी नहीं उपयोग करें? या आप उस बिंदु पर, एक वर्ग का नाम बदल देंगे? –

+0

यह निर्भर करता है, कभी-कभी आपके पास अपनी कक्षा के समान नाम वाला प्लगइन या मणि होता है (मैंने इसे स्वयं को act_as_taggable मणि के साथ देखा है) और मैंने अपना मॉडल नाम बदल दिया। आजकल मैं हमेशा इस्तेमाल करता हूं :: नामांकित कक्षाओं का उपयोग करते समय और मैं हमेशा अपनी कक्षाओं को ** कक्षा कुछ मॉड्यूल :: कुछ क्लास के साथ परिभाषित करता हूं; ** मॉड्यूल कुछ मॉड्यूल के बजाय ** **; कक्षा कुछ क्लास; समाप्त ; समाप्त**। अंत में, कक्षा के पूर्ण नाम से खोजना बहुत आसान हो जाता है। –

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