रूबी में स्थिरांक क्या है?
एक स्थिरांक एक प्रकार का चर है जो हमेशा एक बड़े अक्षर से शुरू होता है। उन्हें केवल बाहर परिभाषित किया जा सकता है विधियों की, जब तक कि आप मेटाप्रोग्रामिंग का उपयोग नहीं करते।
स्थिरांक का उपयोग उन मूल्यों के लिए किया जाता है जिन्हें बदलना नहीं चाहिए, लेकिन रूबी आपको उन्हें बदलने से नहीं रोकती है।
वे इस तरह दिखते हैं :
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
वस्तु को स्वयं बदलने से आपकी रक्षा करता है।
लगातार तरीके
स्थिरांक के साथ काम करने के लिए समर्पित कुछ विधियाँ हैं:
विधि | विवरण |
---|---|
स्थिरांक | एक वर्ग में परिभाषित स्थिरांक का प्रतिनिधित्व करने वाले प्रतीकों की एक सरणी देता है |
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_class = Object.const_get("Array")
लेकिन इसके साथ सावधान रहें क्योंकि यदि स्ट्रिंग params
. से आ रही है तो उपयोगकर्ता कोड इंजेक्ट कर सकता है या उपयोगकर्ता इनपुट का कोई अन्य रूप।
रेल में, स्थिरीकरण विधि है जो मूल रूप से 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
. से बचना चाहिए उपयोगकर्ता इनपुट के साथ।
अगर आपको यह पोस्ट अच्छी लगी हो तो इसे शेयर करना न भूलें ताकि और लोग समझ सकें कि स्थिरांक कैसे काम करते हैं।