स्कोप सभी रूबी डेवलपर्स के लिए समझने के लिए एक महत्वपूर्ण अवधारणा है।
क्यों?
क्योंकि यह कई एरर मैसेजेस और भ्रम का स्रोत है।
स्कोप क्या है?
स्कोप से तात्पर्य है कि किसी दिए गए समय पर कौन से वेरिएबल्स उपलब्ध हैं।
विभिन्न प्रकार के वेरिएबल्स के अलग-अलग स्कोप होते हैं।
एक स्कोप बहुत संकीर्ण (लोकल वेरिएबल्स) या बहुत व्यापक (ग्लोबल वेरिएबल्स) हो सकता है।
आप स्टेट म्यूटेशन और नाम टकराव की समस्याओं से बचने के लिए संकीर्णतम संभव स्कोप का उपयोग करना चाहते हैं।
नीचे उन उदाहरणों की सूची दी गई है कि स्कोप आपके रूबी कोड को कैसे प्रभावित करता है।
लोकल वेरिएबल स्कोप
एक लोकल वेरिएबल का सबसे संकीर्ण स्कोप होता है।
विशेष रूप से, मेथड्स के अंदर परिभाषित लोकल वेरिएबल्स मेथड के वापस आने के बाद मौजूद नहीं रहते।
यहाँ एक उदाहरण है:
a = 50 def apple a = 100 puts a end
आपको क्या लगता है apple क्या प्रिंट करेगा?
यहाँ जवाब है:
जब आप apple कॉल करते हैं तो यह हमेशा 100 प्रिंट करेगा।
यह तथ्य कि a को मेथड के बाहर 50 के रूप में परिभाषित किया गया है, का a वेरिएबल पर मेथड के अंदर कोई प्रभाव नहीं पड़ता।
वे अलग-अलग वेरिएबल्स हैं।
आप स्कोप को साबुन के बुलबुले के रूप में सोच सकते हैं...
यह पहला a = 50 एक बुलबुले में है, फिर जब आप एक मेथड कॉल करते हैं, कोई भी मेथड, आप एक नए खाली बुलबुले में प्रवेश करते हैं।
आप नए बुलबुले में कोई लोकल वेरिएबल नहीं लाते।
और जब मेथड अंत तक पहुंचता है...
बुलबुला फूट जाता है।
बुलबुले के अंदर के वेरिएबल्स गायब हो जाते हैं और आप उन तक नहीं पहुंच सकते।
यही लोकल वेरिएबल्स काम करते हैं।
इंस्टेंस वेरिएबल स्कोप
इंस्टेंस वेरिएबल्स का व्यापक स्कोप होता है।
विशेष रूप से, उनका उपयोग रूबी ऑब्जेक्ट के अंदर डेटा शेयर करने के लिए किया जाता है।
यहाँ एक उदाहरण है:
class Fruit
def more_juice
@quantity = 100
end
def less_juice
@quantity = 50
end
end
इस उदाहरण में, @quantity दोनों more_juice और less_juice मेथड्स के लिए एक ही वेरिएबल है।
यह मेथड्स के बीच एक शेयर्ड वैल्यू है।
लेकिन इस क्लास के बाहर, और यहां तक कि अलग Fruit ऑब्जेक्ट्स पर, @quantity अलग होने वाला है।
उदाहरण:
orange = Fruit.new apple = Fruit.new orange.more_juice apple.less_juice
प्रत्येक ऑब्जेक्ट का अपना इंस्टेंस वेरिएबल्स का सेट होता है।
इसलिए इस उदाहरण में, orange का @quantity 100 होगा, और apple का @quantity 50 होगा।
ठीक वैसे ही जैसे अलग-अलग व्यक्तियों के अलग-अलग नाम, उम्र, देश आदि होते हैं।
ब्लॉक्स में स्कोप कैसे काम करता है
स्कोप के मामले में ब्लॉक्स बहुत दिलचस्प होते हैं।
यदि हम अपने बुलबुले की उपमा का फिर से पालन करें, तो एक ब्लॉक क्या करता है वर्तमान बुलबुले से लोकल वेरिएबल्स को साथ लाता है।
आप उन्हें एक्सेस और बदल सकते हैं।
उदाहरण:
a = []
3.times { a << 1 }
p a # [1, 1, 1]
लेकिन...
बुलबुला अभी भी फूटता है, ब्लॉक के अंदर बनाए गए किसी भी नए लोकल वेरिएबल्स को हटा देता है।
क्या यह दिलचस्प नहीं है?
मेरा मतलब क्या है इसका एक उदाहरण यहाँ है:
1.times { b = [1,2,3] }
b # NameError
इतना ही नहीं, बल्कि ब्लॉक्स अपने साथ उस बिंदु पर बुलबुला भी ले जाएंगे जहां वे बनाए गए थे।
"क्लोजर" के रूप में जाना जाने वाला एक प्रभाव।
याद रखें, यह "बुलबुला" उन सभी वेरिएबल्स का संग्रह है जिन्हें सोर्स कोड में एक विशिष्ट बिंदु पर एक्सेस किया जा सकता है।
यह स्कोप ही है, जिसे एक ऑब्जेक्ट के रूप में एनकैप्सुलेट किया गया है।
हम इसे रूबी में Binding कहते हैं।
रूबी बाइंडिंग्स का उपयोग कैसे करें
एक और अवधारणा जिसे मैं इस लेख में आपके साथ साझा करना चाहता हूं वह है बाइंडिंग्स के बारे में।
आप इन सभी बुलबुलों को जिन्हें हम चर्चा कर रहे हैं, एक रूबी ऑब्जेक्ट में सेव कर सकते हैं, Binding क्लास का एक ऑब्जेक्ट।
उदाहरण:
def banana a = 100 binding end banana.class # Binding
यह बाइंडिंग ऑब्जेक्ट बुलबुला है।
आप बुलबुले में भी देख सकते हैं और देख सकते हैं कि वहां क्या है।
उदाहरण:
banana.send(:local_variables) # [:a]
Rails स्कोप्स के बारे में क्या?
Rails में एक स्कोप रूबी में स्कोप से अलग चीज है।
तो, Rails में स्कोप क्या है?
यह एक कस्टम डेटाबेस क्वेरी को नाम देने का एक तरीका है, जो ActiveRecord मेथड्स से बना है।
यहाँ एक उदाहरण है:
class User < ApplicationRecord
scope(:with_email) { where.not(email: nil) }
end
User.with_email
इसे रूबी में स्कोप की अवधारणा से भ्रमित न करें 🙂
सारांश
आपने रूबी में स्कोप्स और बाइंडिंग ऑब्जेक्ट्स के बारे में सीखा!
याद रखें कि स्कोप परिभाषित करता है कि आप किसी भी समय किन वेरिएबल्स को एक्सेस कर सकते हैं।
यह एक बुलबुले की तरह है, लोकल वेरिएबल्स के अपने बुलबुले होते हैं, जबकि ऑब्जेक्ट्स इंस्टेंस वेरिएबल्स के लिए एक और बुलबुला शेयर करते हैं।
पढ़ने के लिए धन्यवाद।