स्कोप सभी रूबी डेवलपर्स के लिए समझने के लिए एक महत्वपूर्ण अवधारणा है।
क्यों?
क्योंकि यह कई त्रुटि संदेशों और भ्रम का स्रोत है।
स्कोप क्या है?
स्कोप से तात्पर्य है कि किसी भी समय में कौन से चर उपलब्ध हैं।
अलग-अलग तरह के वेरिएबल के अलग-अलग स्कोप होते हैं।
एक दायरा बहुत संकीर्ण (स्थानीय चर) . हो सकता है या बहुत व्यापक (वैश्विक चर) ।
आप राज्य उत्परिवर्तन और नाम टकराव के साथ समस्याओं से बचने के लिए जितना संभव हो सके संकीर्ण दायरे का उपयोग करना चाहते हैं।
उदाहरणों . की सूची इस प्रकार है दायरा आपके रूबी कोड को कैसे प्रभावित करता है।
स्थानीय चर क्षेत्र
एक स्थानीय चर का दायरा सबसे संकीर्ण होता है।
विशेष रूप से, विधियों के अंदर परिभाषित स्थानीय चर अब विधि के वापस आने के बाद मौजूद नहीं रहेंगे।
यहां एक उदाहरण दिया गया है :
a = 50 def apple a = 100 puts a end
आपको क्या लगता है apple प्रिंट होगा?
ये रहा जवाब :
जब आप apple call को कॉल करते हैं यह हमेशा 100 प्रिंट करेगा ।
तथ्य यह है कि a विधि के बाहर परिभाषित किया गया है 50 . के रूप में a . पर कोई प्रभाव नहीं पड़ता चर विधि के अंदर ।
वे भिन्न चर हैं।
आप स्कोप को साबुन के बुलबुले के रूप में सोच सकते हैं …
यह पहला a = 50 . है एक बुलबुले में है, फिर जब आप किसी विधि, किसी भी विधि को कॉल करते हैं, तो आप एक नया EMPTY बबल दर्ज करते हैं।
आप नए बबल के ऊपर कोई स्थानीय चर नहीं लाते हैं।
और जब विधि अंत तक पहुंच जाए…
बुलबुला फूटता है।
बबल के अंदर के वेरिएबल गायब हो जाते हैं और आप उन तक नहीं पहुंच सकते।
इस तरह स्थानीय चर काम करते हैं।
इंस्टेंस वैरिएबल स्कोप
इंस्टेंस वैरिएबल का दायरा व्यापक होता है।
विशेष रूप से, उनका उपयोग रूबी ऑब्जेक्ट के अंदर डेटा साझा करने के लिए किया जाता है।
यहां एक उदाहरण दिया गया है :
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]
रेल स्कोप के बारे में क्या?
रूबी में स्कोप की तुलना में रेल में एक स्कोप एक अलग चीज है।
तो, रेल में क्या गुंजाइश है?
यह एक कस्टम डेटाबेस क्वेरी को नाम देने का एक तरीका है, जो ActiveRecord . से बना है तरीके।
यहां एक उदाहरण दिया गया है :
class User < ApplicationRecord
scope(:with_email) { where.not(email: nil) }
end
User.with_email
रूबी में दायरे की अवधारणा के साथ इसे भ्रमित न करें
सारांश
आपने रूबी में स्कोप और बाइंडिंग ऑब्जेक्ट्स के बारे में सीखा है!
याद रखें कि स्कोप परिभाषित करता है कि आप किन चरों तक पहुंच सकते हैं किसी भी समय पर।
यह एक बुलबुले की तरह है, स्थानीय चरों के अपने बुलबुले होते हैं, जबकि वस्तुएं उदाहरण चर के लिए एक और बुलबुला साझा करती हैं।
पढ़ने के लिए धन्यवाद।