हैरानी की बात है कि यहां सभी 10 जवाब एक ही बात कहते हैं। '::' एक नाम स्थान रिज़ॉल्यूशन ऑपरेटर है, और हाँ यह सच है। लेकिन एक गोटा है जिसे आपको नाम स्वरूप रिज़ॉल्यूशन ऑपरेटर के बारे में महसूस करना होगा जब यह निरंतर लुकअप एल्गोरिथ्म में आता है । जैसा कि मैत्ज़ ने अपनी पुस्तक 'द रूबी प्रोग्रामिंग लैंग्वेज' में लिखा है, निरंतर खोज के कई चरण हैं। सबसे पहले, यह शाब्दिक दायरे में एक स्थिरांक को खोजता है जहां निरंतर संदर्भित होता है। यदि यह शाब्दिक दायरे के भीतर स्थिरांक नहीं पाता है, तो यह वंशानुक्रम पदानुक्रम की खोज करता है । इस निरंतर खोज एल्गोरिथ्म के कारण, नीचे हमें अपेक्षित परिणाम मिलते हैं:
module A
module B
PI = 3.14
module C
class E
PI = 3.15
end
class F < E
def get_pi
puts PI
end
end
end
end
end
f = A::B::C::F.new
f.get_pi
> 3.14
जबकि F, E से विरासत में मिला है, B मॉड्यूल F के लेक्सिकल दायरे में है। नतीजतन, F इंस्टेंसेस मॉड्यूल B में परिभाषित निरंतर PI को संदर्भित करेगा। अब यदि मॉड्यूल B ने PI को परिभाषित नहीं किया है, तो F इंस्टेंसेस PI को संदर्भित करेगा। सुपरक्लास ई में निरंतर परिभाषित।
लेकिन क्या होगा अगर हम नेस्टिंग मॉड्यूल के बजाय '::' का उपयोग करें? क्या हमें वही परिणाम मिलेगा? नहीं!
नेस्टेड मॉड्यूल को परिभाषित करते समय नेमस्पेस रिज़ॉल्यूशन ऑपरेटर का उपयोग करके, नेस्टेड मॉड्यूल और कक्षाएं अब उनके बाहरी मॉड्यूल के लेक्सिकल दायरे में नहीं हैं। जैसा कि आप नीचे देख सकते हैं, ए :: बी में परिभाषित पीआई ए :: बी :: सी :: डी के शाब्दिक दायरे में नहीं है और इस तरह हम असंगठित स्थिर हो जाते हैं जब गेट_पीआई आवृत्ति विधि में पीआई को संदर्भित करने का प्रयास करते हैं:
module A
end
module A::B
PI = 3.14
end
module A::B::C
class D
def get_pi
puts PI
end
end
end
d = A::B::C::D.new
d.get_pi
NameError: uninitialized constant A::B::C::D::PI
Did you mean? A::B::PI