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

Ruby के Private और Protected मेथड्स में महारत: सुरक्षित, रखरखाव योग्य कोड के लिए

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 क्लास पर परिभाषित मेथड्स हैं।

कृपया इस पोस्ट को साझा करें ताकि अधिक लोग इस विषय को समझ सकें!

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


  1. Ruby के Gsub मेथड का उपयोग करने के 3 शक्तिशाली तरीके Ruby के Gsub मेथड का उपयोग करने के 3 शक्तिशाली तरीके

    एक रेगुलर एक्सप्रेशन के साथ पैटर्न बदलें एक सिंगल शब्द को बदलना ठीक है। लेकिन क्या होगा अगर आप एक पैटर्न को बदल सकते हैं? जैसे: एक वर्ष, एक ईमेल एड्रेस, एक फोन नंबर, आदि। आप कर सकते हैं! यहाँ एक उदाहरण है: a1.gsub(/\d/, 2) # a2 पहला आर्गुमेंट एक रेगुलर एक्सप्रेशन है, और इसे यहाँ कवर करना बहुत अधिक

  1. Ruby मेथड्स समझाए गए: आसानी से कस्टम फंक्शन्स बनाएं Ruby मेथड्स समझाए गए: आसानी से कस्टम फंक्शन्स बनाएं

    मेथड्स को कैसे परिभाषित करें Ruby प्रोग्रामिंग भाषा में कई शक्तिशाली बिल्ट-इन मेथड्स हैं जिनका आप उपयोग कर सकते हैं, लेकिन आप अपने खुद के भी बना सकते हैं। कैसे? आप def कीवर्ड का उपयोग करके अपनी खुद की इंस्टेंस मेथड को परिभाषित कर सकते हैं। यहाँ सिंटैक्स है: def gimme_bacon puts Bacon plz. end यहा

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

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