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

रूबी में वेरिएबल स्कोप और ऑब्जेक्ट बाइंडिंग में महारत हासिल करें

स्कोप सभी रूबी डेवलपर्स के लिए समझने के लिए एक महत्वपूर्ण अवधारणा है।

क्यों?

क्योंकि यह कई एरर मैसेजेस और भ्रम का स्रोत है।

स्कोप क्या है?

स्कोप से तात्पर्य है कि किसी दिए गए समय पर कौन से वेरिएबल्स उपलब्ध हैं।

विभिन्न प्रकार के वेरिएबल्स के अलग-अलग स्कोप होते हैं।

एक स्कोप बहुत संकीर्ण (लोकल वेरिएबल्स) या बहुत व्यापक (ग्लोबल वेरिएबल्स) हो सकता है।

आप स्टेट म्यूटेशन और नाम टकराव की समस्याओं से बचने के लिए संकीर्णतम संभव स्कोप का उपयोग करना चाहते हैं।

नीचे उन उदाहरणों की सूची दी गई है कि स्कोप आपके रूबी कोड को कैसे प्रभावित करता है।

लोकल वेरिएबल स्कोप

एक लोकल वेरिएबल का सबसे संकीर्ण स्कोप होता है।

विशेष रूप से, मेथड्स के अंदर परिभाषित लोकल वेरिएबल्स मेथड के वापस आने के बाद मौजूद नहीं रहते।

यहाँ एक उदाहरण है:

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

इसे रूबी में स्कोप की अवधारणा से भ्रमित न करें 🙂

सारांश

आपने रूबी में स्कोप्स और बाइंडिंग ऑब्जेक्ट्स के बारे में सीखा!

याद रखें कि स्कोप परिभाषित करता है कि आप किसी भी समय किन वेरिएबल्स को एक्सेस कर सकते हैं।

यह एक बुलबुले की तरह है, लोकल वेरिएबल्स के अपने बुलबुले होते हैं, जबकि ऑब्जेक्ट्स इंस्टेंस वेरिएबल्स के लिए एक और बुलबुला शेयर करते हैं।

पढ़ने के लिए धन्यवाद।

  1. रूबी के साथ इंसर्शन सॉर्ट में महारत: एक चरण-दर-चरण गाइड रूबी के साथ इंसर्शन सॉर्ट में महारत: एक चरण-दर-चरण गाइड

    नोट: यह रूबी के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर एक श्रृंखला का भाग 4 है। भाग 1 ने बबल सॉर्ट का पता लगाया, भाग 2 ने सिलेक्शन सॉर्ट का पता लगाया, और भाग 3 ने मर्ज सॉर्ट का पता लगाया। जैसा कि हम डेटा को सॉर्ट करने के लिए विभिन्न पद्धतियों का पता लगाना जारी रखते हैं, हम इंसर्शन सॉर्ट की

  1. रूबी में एनवायरनमेंट वेरिएबल्स मास्टर करें: एक व्यावहारिक मार्गदर्शिका रूबी में एनवायरनमेंट वेरिएबल्स मास्टर करें: एक व्यावहारिक मार्गदर्शिका

    एक एनवायरनमेंट वेरिएबल एक कुंजी/मान जोड़ी है, यह इस तरह दिखती है: KEY=VALUE हम इन वेरिएबल्स का उपयोग अपने कंप्यूटर में सभी प्रोग्राम्स के बीच कॉन्फ़िगरेशन विकल्प साझा करने के लिए करते हैं। यही कारण है कि यह सीखना महत्वपूर्ण है कि वे कैसे काम करते हैं और ENV विशेष वेरिएबल का उपयोग करके अपने रूबी प्

  1. रूबी के फ्रीज मेथड को समझना: ऑब्जेक्ट म्यूटेबिलिटी समझाया गया रूबी के फ्रीज मेथड को समझना: ऑब्जेक्ट म्यूटेबिलिटी समझाया गया

    किसी ऑब्जेक्ट के म्यूटेबल होने का क्या अर्थ है? फैंसी शब्दों को आपको भ्रमित न करने दें, म्यूटेबिलिटी का सीधा सा अर्थ है कि किसी ऑब्जेक्ट की आंतरिक स्थिति को बदला जा सकता है। यह उन ऑब्जेक्ट्स को छोड़कर सभी ऑब्जेक्ट्स का डिफ़ॉल्ट है जिन्हें फ्रीज किया गया है, या जो विशेष ऑब्जेक्ट्स की सूची का हिस्सा ह