आज मैं self
के बारे में बात करना चाहता हूं . यदि आप कुछ समय से रूबी की प्रोग्रामिंग कर रहे हैं, तो संभवतः आपने self
. के विचार को आंतरिक कर दिया है . जब भी आप कोई प्रोग्राम पढ़ते या लिखते हैं, self
आपके दिमाग के पीछे है।
लेकिन कम-अनुभवी रूबीवादियों के लिए, self
चौंकाने वाला हो सकता है। यह हमेशा बदलता रहता है, लेकिन यह कभी भी कोड में स्पष्ट रूप से नहीं दिखाया जाता है। आपसे बस जानने की उम्मीद है।
self
. को न समझने के कारण शुरुआती लोगों को बहुत सी समस्याओं का सामना करना पड़ता है . यदि आपने कभी किसी आवृत्ति चर को "खो" दिया है या किसी मिश्रण को कौन सा डेटा दिखाई दे रहा है, इस पर आप हैरान हैं, तो इसका कारण यह है कि आप self
को नहीं समझ पाए हैं उस संदर्भ में।
इस पोस्ट में, हम self
. को देखने जा रहे हैं हर दिन की विभिन्न स्थितियों में।
self
?
आपने लोगों को यह कहते सुना होगा कि रूबी में सब कुछ एक वस्तु है। अगर यह सच है तो इसका मतलब है कि आपके द्वारा लिखा गया प्रत्येक कोड किसी न किसी वस्तु से संबंधित है।
self
एक विशेष चर है जो उस वस्तु को इंगित करता है जो वर्तमान में निष्पादित कोड का "मालिक" है। रूबी self
का उपयोग करती है हर जगह:
- उदाहरण के लिए चर:
@myvar
- विधि और निरंतर खोज के लिए
- विधियों, वर्गों और मॉड्यूल को परिभाषित करते समय।
सिद्धांत रूप में, self
काफी स्पष्ट है। लेकिन व्यवहार में, मुश्किल परिस्थितियों के लिए पॉप अप करना आसान है। इसलिए मैंने यह पोस्ट लिखी है।
self
के उदाहरण
हम अब कई उदाहरणों के माध्यम से कदम उठाने जा रहे हैं। यदि पहले वाले आपको बहुत बुनियादी लगते हैं, तो बस पढ़ते रहें। वे और अधिक उन्नत हो जाते हैं।
इंस्टेंस विधि के अंदर
नीचे दिए गए कोड में, reflect
एक उदाहरण विधि है। यह हमारे द्वारा बनाई गई वस्तु से संबंधित है Ghost.new
. तो self
उस वस्तु की ओर इशारा करता है।
class Ghost
def reflect
self
end
end
g = Ghost.new
g.reflect == g # => true
इनसाइड ऑफ़ ए क्लास मेथड
इस उदाहरण के लिए, reflect
Ghost
. की एक वर्ग विधि है . वर्ग विधियों के साथ, वर्ग स्वयं विधि का "मालिक" है। self
कक्षा की ओर इशारा करता है।
class Ghost
def self.reflect
self
end
end
Ghost.reflect == Ghost # => true
यह मॉड्यूल के अंदर "वर्ग" विधियों के साथ समान काम करता है। उदाहरण के लिए:
module Ghost
def self.reflect
self
end
end
Ghost.reflect == Ghost # => true
याद रखें, रूबी में कक्षाओं और मॉड्यूल को वस्तुओं के रूप में माना जाता है। तो यह व्यवहार पहले उदाहरण में देखे गए उदाहरण विधि व्यवहार से अलग नहीं है।
एक वर्ग या मॉड्यूल परिभाषा के अंदर
रूबी की एक विशेषता जो इसे रेल जैसे ढांचे के लिए इतना उपयुक्त बनाती है कि आप कक्षा और मॉड्यूल परिभाषाओं के अंदर मनमाना कोड निष्पादित कर सकते हैं। जब आप किसी वर्ग/मॉड्यूल परिभाषा के अंदर कोड डालते हैं, तो यह किसी अन्य रूबी कोड की तरह ही चलता है। केवल वास्तविक अंतर self
. का मान है .
जैसा कि आप नीचे देख सकते हैं, self
उस वर्ग या मॉड्यूल को इंगित करता है जो परिभाषित होने की प्रक्रिया में है।
class Ghost
self == Ghost # => true
end
module Mummy
self == Mummy # => true
end
इनसाइड मिक्सिन मेथड्स
जब बात self
की आती है तो मिश्रित तरीके "सामान्य" उदाहरण या वर्ग विधियों की तरह ही व्यवहार करते हैं . यह समझ में आता है। अन्यथा मिक्सिन उस क्लास के साथ इंटरैक्ट नहीं कर पाएगा जिसमें आपने उसे मिक्स किया था।
इंस्टेंस विधियां
भले ही reflect
विधि को मॉड्यूल में परिभाषित किया गया था, इसका self
उस वर्ग का उदाहरण है जिसमें इसे मिश्रित किया गया था।
module Reflection
def reflect
self
end
end
class Ghost
extend Reflection
end
Ghost.reflect == Ghost # => true
कक्षा विधियां
जब हम extend
. करते हैं कक्षा विधियों में मिश्रण करने के लिए एक वर्ग, self
बिल्कुल वैसा ही व्यवहार करता है जैसा वह सामान्य वर्ग विधियों में करता है।
module Reflection
def reflect
self
end
end
class Ghost
extend Reflection
end
Ghost.reflect == Ghost # => true
मेटाक्लास के अंदर
संभावना है कि आपने कई क्लास विधियों को एक साथ परिभाषित करने के लिए यह लोकप्रिय शॉर्टकट देखा है।
class Ghost
class << self
def method1
end
def method2
end
end
end
class << foo
वाक्य रचना वास्तव में बहुत दिलचस्प है। यह आपको किसी ऑब्जेक्ट के मेटाक्लास तक पहुंचने देता है - जिसे "सिंगलटन क्लास" या "ईजेनक्लास" भी कहा जाता है। मैं भविष्य की पोस्ट में मेटाक्लास को और अधिक गहराई से कवर करने की योजना बना रहा हूं। लेकिन अभी के लिए, आपको केवल यह जानने की जरूरत है कि मेटाक्लास वह जगह है जहां रूबी उन तरीकों को संग्रहीत करती है जो किसी विशिष्ट वस्तु के लिए अद्वितीय हैं।
यदि आप self
. को एक्सेस करते हैं class << foo
. के अंदर से ब्लॉक, आपको मेटाक्लास मिलता है।
class << "test"
puts self.inspect
end
# => #<Class:#<String:0x007f8de283bd88>
किसी भी कक्षा के बाहर
यदि आप किसी भी वर्ग के बाहर कोड चला रहे हैं, तब भी रूबी self
. प्रदान करता है . यह "मुख्य" की ओर इशारा करता है, जो Object
. का एक उदाहरण है :
puts self.inspect # => main