Ruby में प्राइवेट मेथड क्या है?
यह एक प्रकार का मेथड है जिसे आप केवल उस क्लास के अंदर से कॉल कर सकते हैं जहां यह परिभाषित है।
यह आपको अपने मेथड्स तक पहुंच को नियंत्रित करने की अनुमति देता है।
एक Ruby मेथड हो सकता है:
- private
- public (डिफ़ॉल्ट)
- protected
डिफ़ॉल्ट रूप से आपके सभी मेथड्स public हैं।
कोई भी उनका उपयोग कर सकता है!
लेकिन आप इसे बदल सकते हैं, मेथड को private या protected बनाकर।
यह उपयोगी क्यों है?
क्योंकि आप इन मेथड्स को बदलना आसान बना सकते हैं।
कल्पना करें कि आप एक कोड लाइब्रेरी लिख रहे हैं जिसे काम पर कुछ अलग प्रोजेक्ट्स में उपयोग किया जाएगा।
जब ये प्रोजेक्ट्स आपकी लाइब्रेरी को लागू करते हैं, तो वे आपके द्वारा बनाई गई क्लासेज पर मेथड्स कॉल करने जा रहे हैं।
अब:
आप एक नया संस्करण जारी करते हैं...
लेकिन आपने एक public मेथड पर नाम बदलने का फैसला किया।
यह हर प्रोजेक्ट पर त्रुटियां उत्पन्न करेगा जो इस मेथड का उपयोग कर रहा है!
इसे याद रखें:
कम public मेथड्स होने से आपकी क्लास के अंदर बदलाव की स्वतंत्रता बढ़ जाती है।
आइए कुछ कोड उदाहरण देखते हैं!
Ruby में प्राइवेट मेथड्स को समझना
क्या आपने कभी "private method called" त्रुटि संदेश देखा है?
यह वाला:
self.puts 123 # NoMethodError: private method `puts' called
तो आपने private मेथड का गलत तरीके से उपयोग करने की कोशिश की है।
आप केवल प्राइवेट मेथड को उसके दम पर उपयोग कर सकते हैं।
उदाहरण:
puts 123
यह वही मेथड है, लेकिन आपको इसे इस तरह कॉल करना होगा।
प्राइवेट मेथड्स हमेशा self के संदर्भ में कॉल किए जाते हैं।
दूसरे शब्दों में...
आप केवल प्राइवेट मेथड्स का उपयोग कर सकते हैं:
- उसी क्लास के अन्य मेथड्स के साथ
- पैरेंट क्लास से विरासत में मिले मेथड्स
- मॉड्यूल से शामिल मेथड्स
इसका मतलब है कि आप उस क्लास के बाहर से प्राइवेट मेथड्स को कॉल नहीं कर सकते जो उन्हें परिभाषित करती है।
क्योंकि इसके लिए एक "explicit receiver" की आवश्यकता होगी।
जब तक...
आप इस नियम को बायपास करने के लिए send जैसे मेथड का उपयोग करते हैं।
send(:puts, "apple")
आप private मेथड कैसे परिभाषित करते हैं?
इस तरह:
def bacon "private bacon" end private :bacon
शब्द private स्वयं एक कीवर्ड नहीं है, यह Kernel मॉड्यूल पर परिभाषित एक मेथड है।
अपने प्राइवेट मेथड्स कहां रखें
एक क्लास के लिए एक से अधिक प्राइवेट मेथड होना सामान्य है।
आप इन मेथड्स को कहां रखते हैं?
यह करें:
class Food def public_method end private def bacon end def orange end def coconut end end
private के बाद हर इंस्टेंस मेथड एक प्राइवेट मेथड बन जाता है।
यदि आप क्लास मेथड को प्राइवेट के रूप में परिभाषित करना चाहते हैं तो
private_class_method :method_nameका उपयोग कर सकते हैं
अपने सभी पब्लिक मेथड्स को पहले परिभाषित करना, फिर अपने private मेथड्स को क्लास के अंत में एक साथ परिभाषित करना एक सामान्य पैटर्न है।
पब्लिक मेथड्स
पब्लिक Ruby में डिफ़ॉल्ट मेथड विजिबिलिटी है।
यहां एक उदाहरण है:
def orange "Vitamin C" end
यदि आपके पास एक ऑब्जेक्ट food है जो orange को परिभाषित करता है, तो आप इसे इस तरह कॉल कर सकते हैं:
food.orange
यदि किसी मेथड को प्राइवेट या प्रोटेक्टेड बनाया गया है, तो आप इसे फिर से पब्लिक बना सकते हैं।
इस तरह:
public :orange
प्रोटेक्टेड मेथड क्या है?
प्रोटेक्टेड मेथड्स कम आम हैं।
वे private मेथड्स की तरह हैं, लेकिन आप उन्हें किसी ऑब्जेक्ट पर कॉल कर सकते हैं न कि केवल सीधे।
यदि आप इस उदाहरण को प्राइवेट के साथ आजमाते हैं तो आपको त्रुटि मिलेगी:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :name end food = Food.new("chocolate") puts food == food
आपको त्रुटि मिलती है क्योंकि name प्राइवेट होगा इसलिए आप other.name नहीं कर सकते।
लेकिन protected के साथ यह कोड काम करता है!
Private बनाम Protected मेथड्स
यही अंतर है, तथ्य यह है कि protected मेथड को private रखता है, लेकिन यह आपको उस मेथड को किसी ऑब्जेक्ट पर कॉल करने की भी अनुमति देता है।
प्राइवेट के साथ आप केवल name कर सकते हैं, प्रोटेक्टेड के साथ आप object.name कर सकते हैं।
आपको प्रोटेक्टेड कब उपयोग करना चाहिए?
केवल यदि आपके पास एक बहुत विशिष्ट मामला है, जैसे equals (==) मेथड।
Ruby डॉक्यूमेंटेशन जब भी संभव हो protected के बजाय private का उपयोग करने की सिफारिश करता है।
और यह नोट है:
"एक प्रोटेक्टेड मेथड धीमा है क्योंकि यह इंलाइन कैश का उपयोग नहीं कर सकता।"
मैं इसके बारे में उत्सुक था इसलिए मैंने कुछ बेंचमार्क चलाए:
public: 2813891.9 i/s private: 2699273.8 i/s protected: 2572122.0 i/s
यह प्रदर्शन में 8.5% का अंतर है।
वीडियो ट्यूटोरियल
सारांश
आपने Ruby मेथड विजिबिलिटी, पब्लिक, प्राइवेट और प्रोटेक्टेड मेथड्स के बारे में सीखा। ये Ruby कीवर्ड्स नहीं हैं, ये स्वयं Module क्लास पर परिभाषित मेथड्स हैं।
कृपया इस पोस्ट को साझा करें ताकि अधिक लोग इस विषय को समझ सकें!
पढ़ने के लिए धन्यवाद 🙂