Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी कॉन्स्टेंट्स में महारत: परिभाषा, उपयोग और सर्वोत्तम अभ्यास

रूबी में कॉन्स्टेंट क्या है?

एक कॉन्स्टेंट एक प्रकार का वेरिएबल है जो हमेशा एक बड़े अक्षर से शुरू होता है। उन्हें केवल मेथड्स के बाहर परिभाषित किया जा सकता है, जब तक कि आप मेटाप्रोग्रामिंग का उपयोग न करें।

कॉन्स्टेंट्स का उपयोग उन मानों के लिए किया जाता है जो बदलने वाले नहीं होते, लेकिन रूबी आपको उन्हें बदलने से नहीं रोकता।

वे ऐसे दिखते हैं:

 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 से बचना चाहिए।

अगर आपको यह पोस्ट पसंद आया तो इसे शेयर करना न भूलें ताकि अधिक लोग समझ सकें कि कॉन्स्टेंट्स कैसे काम करते हैं।

  1. GDPR के लिए एक व्यापक गाइड: प्रमुख सिद्धांत, अनुपालन और सर्वोत्तम अभ्यास GDPR के लिए एक व्यापक गाइड: प्रमुख सिद्धांत, अनुपालन और सर्वोत्तम अभ्यास

    कैम्ब्रिज एनालिटिका द्वारा फेसबुक उपयोगकर्ताओं के डेटा के दुरुपयोग ने दुनिया भर के लाखों लोगों का ध्यान आकर्षित किया। इसने लोगों को पहले से कहीं अधिक डेटा गोपनीयता और डेटा सुरक्षा के महत्व का एहसास कराया। लोगों में डेटा गोपनीयता और सुरक्षा के बारे में बढ़ती जांच के साथ चिंता बढ़ने के साथ। यूरोपीय सं

  1. ब्लूटूथ 5: सुविधाओं, लाभों और अनुकूलता के लिए एक व्यापक गाइड ब्लूटूथ 5: सुविधाओं, लाभों और अनुकूलता के लिए एक व्यापक गाइड

    वाई-फाई की तरह, ब्लूटूथ किसी भी मोबाइल या अन्य डिवाइस का एक अभिन्न अंग है। न केवल इसका उपयोग फ़ाइलों और डेटा को ट्रांसफर करने के लिए किया जाता है बल्कि यह आपको अपने वायरलेस डिवाइस जैसे स्पीकर, स्पोर्ट्स इयरफोन आदि को कनेक्ट करने की भी अनुमति देता है। ब्लूटूथ ने न केवल संचार के तरीके को बदल दिया बल्

  1. PBM फाइल्स समझें: मुख्य तथ्य और उनका उपयोग कैसे करें PBM फाइल्स समझें: मुख्य तथ्य और उनका उपयोग कैसे करें

    जब से कंप्यूटर सुलभ हुए हैं, आप टेक्नोलॉजी और मनोरंजन के क्षेत्र में उल्लेखनीय वृद्धि देख सकते हैं। मनोरंजन के सबसे आम स्रोतों में से एक है आपकी तस्वीरें और अन्य मीडिया। हालांकि, वर्तमान टेक्नोलॉजी आपको किसी विशिष्ट टूल को चुनने के लिए परेशान नहीं करती जो किसी फाइल को सपोर्ट कर सके। लेकिन यह जानना अ