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

रूबी और रूबी ऑन रेल्स में मेथड्स कैसे डेलिगेट करें?

यह लेख रूबी में विधि प्रतिनिधिमंडल के बारे में है।

आप सीखेंगे कि delegate का उपयोग कैसे करें विधि, Forwardable मॉड्यूल और SimpleDelegator कक्षा।

हमें प्रतिनिधिमंडल की आवश्यकता क्यों है ?

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, कक्षाओं के एक साथ काम करने के दो तरीके हैं।

वे हैं :

  • विरासत
  • रचना

वंशानुक्रम के साथ, आप वर्ग पदानुक्रम बनाते हैं, जहां एक अभिभावक वर्ग किसी भी वर्ग के साथ विधियों, स्थिरांक और आवृत्ति चर परिभाषाओं को साझा करता है जो इससे प्राप्त होता है।

उदाहरण के लिए :

रूबी में, प्रत्येक वस्तु Object . से विरासत में मिलती है डिफ़ॉल्ट रूप से कक्षा।

इसलिए आपको puts . जैसी विधियों तक पहुंच प्राप्त होती है , class &object_id

रचना के साथ एक वर्ग दूसरे वर्ग से वस्तुओं का निर्माण (या दिया जाता है) करता है ... फिर वह इन वस्तुओं का उपयोग उन्हें कार्य सौंपने के लिए करता है।

उदाहरण के लिए :

एक कंप्यूटर कई भागों (वस्तुओं) से बना होता है और प्रत्येक भाग एक काम को अच्छी तरह से करना जानता है।

यदि आप स्क्रीन पर कुछ प्रस्तुत करना चाहते हैं तो कंप्यूटर ग्राफिक्स कार्ड को बताएगा कि क्या दिखाना है, लेकिन यह नहीं कि कैसे करना है।

वह है रचना !

लेकिन क्या होगा यदि आप कंप्यूटर हैं और आप ग्राफिक्स कार्ड विधियों तक पहुंच देना चाहते हैं?

आपको उनके बीच किसी तरह का "पुल" बनाना होगा।

आइए देखें कि यह कैसे करना है।

रूबी विधि प्रतिनिधिमंडल - उदाहरण

हमारे पास दो वर्ग हैं:

  • Computer
  • Memory

निम्न कोड को देखते हुए :

क्लास कंप्यूटर डीफ़ इनिशियलाइज़ @मेमोरी =मेमोरी। न्यू एंडएंडक्लास मेमोरी डीफ़ इनिशियलाइज़ @डेटा =[] एंड डीफ़ राइट (डेटा) @डेटा <<डेटा एंड डीफ़ रीड (इंडेक्स) @डेटा [इंडेक्स] एंडेंडकंप्यूटर =कंप्यूटर.नया

हम केवल Computer . के माध्यम से मेमोरी तक पहुंचने में सक्षम होना चाहते हैं ।

यह कई कारणों से हो सकता है :

  • आपके पास केवल 1 मेमोरी यूनिट है, इसका मतलब है कि आपको केवल 1 मेमोरी ऑब्जेक्ट चाहिए। एक वस्तु में पहुंच को केंद्रीकृत करके आप उसे प्राप्त कर सकते हैं।
  • आप यह नियंत्रित करना चाहते हैं कि कौन मेमोरी (विभिन्न एप्लिकेशन) तक पहुंच सकता है और मेमोरी के किन हिस्सों का वे उपयोग कर सकते हैं।
  • आप सुरक्षा या डिबगिंग उद्देश्यों के लिए प्रत्येक मेमोरी एक्सेस को लॉग करना चाहते हैं।

अब, यदि आप ऐसा करने का प्रयास करते हैं :

कंप्यूटर.लिखें("रूबीगाइड्स")

यह NoMethodError के साथ विफल हो जाएगा क्योंकि कोई write नहीं है Computer पर विधि ।

#<कंप्यूटर:0x000055c2e8f7d310> (NoMethodError) के लिए
अपरिभाषित विधि 'लिखें' 

Computer वर्ग नहीं जानता कि write से आपका क्या मतलब है ।

जब तक...

आप एक write . बनाएं विधि!

यहां बताया गया है :

क्लास कंप्यूटर डीफ़ इनिशियलाइज़ @memory =Memory.new end def write(data) @memory.write(data) end def read(index) @memory.read(index) endend

हम अनुरोधों को @memory . पर भेज रहे हैं वस्तु।

वह विधि प्रतिनिधिमंडल है।

<ब्लॉकक्वॉट>

नोट :यह इन विधियों को आपके सार्वजनिक इंटरफ़ेस का हिस्सा बनाता है (वे सभी के लिए उपलब्ध हो जाते हैं) और आप हमेशा ऐसा नहीं चाहते हैं।

क्या किसी प्रकार का विधि प्रतिनिधिमंडल के लिए शॉर्टकट . है ?

हाँ!

आइए एक नजर डालते हैं...

फॉरवर्डेबल मॉड्यूल का उपयोग कैसे करें

अब :

आप Forwardable . का उपयोग कर सकते हैं प्रतिनिधि विधियों को परिभाषित करने के लिए रूबी के साथ मॉड्यूल शामिल है।

यह इस तरह काम करता है :

'फॉरवर्डेबल' क्लास की आवश्यकता है कंप्यूटर फॉरवर्डेबल def_delegators :@memory, :read, :write def Initialize @memory =Memory.new endend
का विस्तार करें

यह आपको हमारे द्वारा पहले बनाए गए तरीकों को हटाने की अनुमति देता है और यह वही काम करेगा।

Forwardable आपके लिए विधि तर्क (ब्लॉक सहित!) का ध्यान रखेगा, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

क्या यह अच्छा नहीं है?

रेल प्रतिनिधि पद्धति का उपयोग कैसे करें

यदि आप रेल, या स्वयं ActiveSupport रत्न का उपयोग कर रहे हैं, तो आपके पास delegate तक पहुंच है विधि।

यह इस तरह काम करता है :

कक्षा कंप्यूटर प्रतिनिधि :पढ़ें, :लिखें, को :@memory def इनिशियलाइज़ @memory =Memory.new endend

delegate विधि एक prefix लेती है तर्क, जो आपको विधि नामों में एक उपसर्ग जोड़ने की अनुमति देता है।

उदाहरण :

कक्षा कंप्यूटर प्रतिनिधि:पढ़ें, लिखें, उपसर्ग:"मेमोरी", से::@मेमोरी डीईएफ़ इनिशियलाइज़ @memory =Memory.new endend

परिणामस्वरूप दो विधियां :

  • memory_read
  • memory_write

SimpleDelegator के साथ सब कुछ कैसे डेलिगेट करें

आपके द्वारा अभी सीखी गई इन तकनीकों का उपयोग विशिष्ट विधियों को अग्रेषित करने या प्रत्यायोजित करने के लिए किया जाता है।

लेकिन अगर आप किसी वस्तु को लपेटना चाहते हैं और उसकी सभी विधियों को उजागर करना चाहते हैं...

आप SimpleDelegator . का उपयोग कर सकते हैं कक्षा!

यहां बताया गया है :

आवश्यकता 'प्रतिनिधि' वर्ग CoolArray  

अब CoolArray आपके द्वारा पास की गई वस्तु की तरह व्यवहार करता है new

यह क्यों उपयोगी है?

आप मूल वर्ग को बदले बिना इस ऑब्जेक्ट में नए तरीके जोड़ सकते हैं।

वीडियो ट्यूटोरियल

सारांश

आपने रूबी में वस्तु संरचना के बारे में सीखा है और विभिन्न तकनीकों का उपयोग करके विधियों को कैसे सौंपना है!

अगर आपको यह लेख अच्छा लगा हो तो कृपया इसे शेयर करें अपने रूबी दोस्तों के साथ।

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


  1. रूबी उपनाम कीवर्ड का उपयोग कैसे करें

    आप रूबी पद्धति को दो तरह से वैकल्पिक नाम दे सकते हैं: उपनाम (कीवर्ड) उपनाम_विधि क्योंकि वे एक ही काम को थोड़े अलग तरीके से करते हैं, यह एक भ्रमित करने वाला विषय हो सकता है। यह छवि मतभेदों का सारांश है : आइए एक ठोस समझ पाने के लिए इन अंतरों को और अधिक विस्तार से देखें! उपनाम कीवर्ड सबसे पहले

  1. अपने रूबी तरीकों की जासूसी कैसे करें

    रूबी में एक अंतर्निहित अनुरेखण प्रणाली है जिसे आप TracePoint . का उपयोग करके एक्सेस कर सकते हैं कक्षा। कुछ चीज़ें जिन्हें आप ट्रेस कर सकते हैं, वे हैं मेथड कॉल, नए थ्रेड और अपवाद। आप इसका उपयोग क्यों करना चाहेंगे? ठीक है, यदि आप किसी निश्चित विधि के निष्पादन का पता लगाना चाहते हैं तो यह उपयोगी हो

  1. रूबी के ऐरे क्लास का उपयोग कैसे करें (उदाहरण + उपयोगी तरीके)

    एक सरणी क्या है? एक सरणी एक अंतर्निहित रूबी वर्ग है, जिसमें शून्य या अधिक वस्तुओं की सूची होती है , और इसमें वे विधियां शामिल हैं जो इन सभी वस्तुओं को आसानी से जोड़ने, एक्सेस करने और लूप करने में आपकी सहायता करती हैं। यह मददगार है, क्योंकि यदि सरणियाँ मौजूद नहीं होतीं तो आपको कई चरों का उपयोग करना