रूबी में कॉन्स्टेंट क्या है?
एक कॉन्स्टेंट एक प्रकार का वेरिएबल है जो हमेशा एक बड़े अक्षर से शुरू होता है। उन्हें केवल मेथड्स के बाहर परिभाषित किया जा सकता है, जब तक कि आप मेटाप्रोग्रामिंग का उपयोग न करें।
कॉन्स्टेंट्स का उपयोग उन मानों के लिए किया जाता है जो बदलने वाले नहीं होते, लेकिन रूबी आपको उन्हें बदलने से नहीं रोकता।
वे ऐसे दिखते हैं:
FRUIT = "orange"
अब:
क्योंकि कॉन्स्टेंट्स एक महत्वपूर्ण विषय हैं, हम इस लेख में उनका विस्तार से पता लगाने जा रहे हैं!
कॉन्स्टेंट्स कैसे परिभाषित करें
एक कॉन्स्टेंट को घोषित करने के लिए किसी विशेष प्रतीक या सिंटैक्स की आवश्यकता नहीं होती। आपको बस पहला अक्षर बड़ा करना होगा।
निम्नलिखित वैध कॉन्स्टेंट्स हैं:
ABC = 1 Goo = 2 Foo = 3
ध्यान दें कि आप मेथड के अंदर कॉन्स्टेंट्स परिभाषित नहीं कर सकते।
आपको यह गूढ़ त्रुटि संदेश मिलेगा:
def the_method ABC = 1 end # "dynamic constant assignment"
तो बस अपने कॉन्स्टेंट्स को मेथड्स के बाहर परिभाषित करें, आमतौर पर हम चाहते हैं कि कॉन्स्टेंट परिभाषाएं आपकी क्लास के शीर्ष पर हों ताकि वे स्पष्ट रूप से दिखाई दें।
class RubyBlog URL = "rubyguides.com" AUTHOR = "Jesus Castello" end
आप इन कॉन्स्टेंट्स को क्लास मेथड्स के अंदर या क्लास के बाहर निम्नलिखित सिंटैक्स का उपयोग करके एक्सेस कर सकते हैं:
p RubyBlog::AUTHOR # "Jesus Castello"
हम इस पोस्ट में बाद में कॉन्स्टेंट्स के स्कोप के बारे में थोड़ी और बात करेंगे, तो उसके लिए बने रहें!
अनइनिशियलाइज़्ड कॉन्स्टेंट त्रुटि
एक आम त्रुटि जो आपको मिल सकती है वह है:
puts Foo # "uninitialized constant Foo (NameError)"
मैं चाहता हूं कि आप मानसिक रूप से इस त्रुटि का अनुवाद "कॉन्स्टेंट नहीं मिला" के रूप में करें।
इस त्रुटि को समझने के लिए एक महत्वपूर्ण बिंदु यह है कि रूबी क्लासेस कॉन्स्टेंट्स हैं।
उदाहरण:
Array String Hash
वे कॉन्स्टेंट्स हैं क्योंकि पहला अक्षर बड़ा है।
जब आप एक क्लास परिभाषित करते हैं, तो आप वास्तव में एक Class ऑब्जेक्ट बना रहे होते हैं, जिसे एक कॉन्स्टेंट को असाइन किया जाता है।
कॉन्स्टेंट क्लास का नाम बन जाता है।
यह महत्वपूर्ण क्यों है?
क्योंकि "अनइनिशियलाइज़्ड कॉन्स्टेंट" त्रुटि देखने का सबसे संभावित कारण यह है कि आप उस फाइल या जेम को require करना भूल गए जो कॉन्स्टेंट को परिभाषित करता है।
या शायद आपने कॉन्स्टेंट के नाम की वर्तनी गलत लिखी है।
तो उस पर नज़र रखें।
कॉन्स्टेंट्स बदल सकते हैं
जैसा कि मैंने परिचय में उल्लेख किया, रूबी कॉन्स्टेंट्स बदल सकते हैं।
उदाहरण:
ABC = 1 ABC = 2
लेकिन आपको यह चेतावनी संदेश दिखाई देगा:
2: warning: already initialized constant ABC
आपका प्रोग्राम अभी भी ठीक काम करेगा, लेकिन आप इससे बचना चाहेंगे।
कॉन्स्टेंट को बदलने से रोकने का कोई तरीका नहीं है क्योंकि रूबी में वेरिएबल्स कंटेनर नहीं हैं, वे केवल ऑब्जेक्ट्स के पॉइंटर्स हैं।
या लेबल, यदि आप पसंद करते हैं।
आप सबसे अच्छा यह कर सकते हैं कि अपरिवर्तनीय ऑब्जेक्ट्स का उपयोग करें।
उदाहरण:
AUTHOR = "Jesus Castello".freeze AUTHOR << "o" # RuntimeError: can't modify frozen String
संबंधित लेख: रूबी म्यूटेबिलिटी और फ्रीज़ मेथड।
इस उदाहरण में, आप अभी भी बदल सकते हैं कि AUTHOR कॉन्स्टेंट किस ओर इशारा कर रहा है, freeze केवल आपको ऑब्जेक्ट को स्वयं बदलने से बचाता है।
कॉन्स्टेंट मेथड्स
कॉन्स्टेंट्स के साथ काम करने के लिए कुछ समर्पित मेथड्स हैं:
| मेथड | विवरण |
|---|---|
| constants | प्रतीकों की एक सरणी लौटाता है जो एक क्लास में परिभाषित कॉन्स्टेंट्स को दर्शाते हैं |
| const_get | एक कॉन्स्टेंट के लिए मान लौटाता है। पैरामीटर के रूप में एक प्रतीक या स्ट्रिंग लेता है |
| const_set | एक कॉन्स्टेंट के लिए मान सेट करता है। दो पैरामीटर लेता है: प्रतीक के रूप में कॉन्स्टेंट नाम और कॉन्स्टेंट मान |
| const_missing | method_missing के समान लेकिन कॉन्स्टेंट्स के लिए |
| const_defined? | यदि दिए गए कॉन्स्टेंट (प्रतीक के रूप में) को परिभाषित किया गया है तो सच लौटाता है |
| remove_const | एक कॉन्स्टेंट को हटाता है |
| private_constant | एक कॉन्स्टेंट को प्राइवेट बनाता है ताकि इसे Class::ABC सिंटैक्स के साथ क्लास के बाहर एक्सेस न किया जा सके |
इन मेथड्स का उपयोग करके आप कुछ मेटाप्रोग्रामिंग ट्रिक्स कर सकते हैं।
उदाहरण:
module Food class Bacon; end class Chocolate; end end puts "Classes defined inside #{Food}:" puts Food.constants आप "Array" जैसी स्ट्रिंग का भी उपयोग कर सकते हैं और वास्तविक क्लास प्राप्त कर सकते हैं:
array_class = Object.const_get("Array") लेकिन इसके साथ सावधान रहें क्योंकि यदि स्ट्रिंग params या उपयोगकर्ता इनपुट के किसी अन्य रूप से आ रही है तो उपयोगकर्ता कोड इंजेक्ट कर सकता है।
रेल्स में, constantize मेथड है जो मूल रूप से आपके लिए const_get करता है, लेकिन ध्यान रखें कि यह कोई सुरक्षा जांच नहीं करता।
चीटशीट

रूबी कॉन्स्टेंट स्कोप
जब आप किसी भी क्लास के बाहर, अपने कोड के शीर्ष स्तर पर एक कॉन्स्टेंट बनाते हैं, तो वह कॉन्स्टेंट हर जगह उपलब्ध होगा।
कॉन्स्टेंट्स चाइल्ड क्लासेस में भी उपलब्ध हैं।
class A FOO = 1 end class B < A def foo puts FOO end end B.constants # [:FOO]
नेस्टेड मॉड्यूल या क्लास के बाहर परिभाषित कॉन्स्टेंट्स नेस्टेड क्लासेस के अंदर भी उपलब्ध हैं।
module Food STORE_ADDRESS = "The moon" class Bacon def foo; puts STORE_ADDRESS; end end end fb = Food::Bacon.new fb.foo # "The moon"
मॉड्यूल मिक्सिंग
मिक्स-इन मॉड्यूल्स के कॉन्स्टेंट्स भी उपलब्ध हैं:
module Mixin A = 123 end class Product include Mixin puts A end # 123
ध्यान दें कि यह मॉड्यूल शामिल करते समय काम करता है, यह काम नहीं करेगा यदि आप इसे एक्सटेंड कर रहे हैं।
उदाहरण:
class Product extend Mixin puts A end # uninitialized constant Product::A
भी:
जब आप किसी मॉड्यूल से शामिल मेथड का उपयोग करते हैं, तो रूबी उस स्थान से कॉन्स्टेंट्स की तलाश शुरू करेगा जहां वह मेथड परिभाषित है।
उदाहरण:
module Parent def print_value VALUE end end class Child include Parent VALUE = 1 end # Works p Child::VALUE # uninitialized constant Parent::VALUE p Child.new.print_value
ध्यान रखने वाली बात!
मॉड्यूल नेस्टिंग
मैं आपको नेस्टेड क्लासेस (मॉड्यूल्स के लिए समान) के साथ एक और उदाहरण दिखाना चाहता हूं।
class A FOO = 1 end class A::B class C puts FOO end end
यहां A::B नोटेशन पर ध्यान दें, जिसे हमने शॉर्टकट के रूप में उपयोग करने का प्रयास किया। लेकिन समस्या यह है कि क्लास C को FOO तक सीधी पहुंच नहीं होगी।
इस कारण से, आप इस तरह की नेस्टिंग से चिपके रहना चाहते हैं:
class A FOO = 1 end class A class B class C puts FOO end end end
पहले उदाहरण में, आप अभी भी कॉन्स्टेंट तक पहुंचने के लिए ::A::FOO कर सकते हैं, लेकिन अगर क्लास का नाम बदलता है तो आपको त्रुटि मिलेगी।
यह ::A::FOO सिंटैक्स काम करता है क्योंकि यह रूबी को शीर्ष-स्तरीय स्कोप में देखने के लिए कहता है, जहां Array और String जैसे कॉन्स्टेंट्स परिभाषित हैं।
वीडियो
सारांश
आपने रूबी कॉन्स्टेंट्स के बारे में सीखा, एक प्रकार का वेरिएबल जिसका कुछ दिलचस्प व्यवहार है। आप कॉन्स्टेंट का मान बदल सकते हैं लेकिन यह एक चेतावनी प्रिंट करेगा।
आपने यह भी सीखा कि क्लास नाम कॉन्स्टेंट्स हैं और आपको उपयोगकर्ता इनपुट के साथ const_get से बचना चाहिए।
अगर आपको यह पोस्ट पसंद आया तो इसे शेयर करना न भूलें ताकि अधिक लोग समझ सकें कि कॉन्स्टेंट्स कैसे काम करते हैं।