আশ্চর্যজনকভাবে, এখানে সমস্ত 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
এফ থেকে ই এর উত্তরাধিকার সূত্রে, বি মডিউলটি এফ এর লিক্সিকাল স্কোপের মধ্যে রয়েছে ফলস্বরূপ, এফ দৃষ্টান্তগুলি মডিউল বিতে সংজ্ঞায়িত ধ্রুবক পিআই উল্লেখ করবে এখন যদি মডিউল বি পিআইকে সংজ্ঞায়িত না করে, তবে এফ দৃষ্টান্তগুলি পিআইকে নির্দেশ করবে ধ্রুবক সুপারক্লাস ই সংজ্ঞায়িত।
তবে যদি আমরা '::' বাসা বাঁধার মডিউলগুলির পরিবর্তে ব্যবহার করি? আমরা কি একই ফলাফল পেতে পারি? না!
নেস্টেড মডিউলগুলি সংজ্ঞায়িত করার সময় নেমস্পেস রেজোলিউশন অপারেটরটি ব্যবহার করে, নেস্টেড মডিউলগুলি এবং ক্লাসগুলি আর তাদের বাহ্যিক মডিউলগুলির লেজিকাল স্কোপের মধ্যে নেই। আপনি নীচে দেখতে পাচ্ছেন, A :: B এ সংজ্ঞায়িত পিআই A :: B :: C :: D এর লেজিকাল স্কোপে নেই এবং এইভাবে get_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