कोई भी देखो ऑब्जेक्ट ओरिएंटेड कोड और यह सभी कमोबेश इसी पैटर्न पर चलता है। एक ऑब्जेक्ट बनाएं, उस ऑब्जेक्ट पर कुछ तरीकों को कॉल करें और उस ऑब्जेक्ट की एक्सेस विशेषताओं को देखें। किसी वस्तु के साथ आप ऐसा नहीं कर सकते हैं, सिवाय इसके कि वह किसी अन्य वस्तु की विधि के पैरामीटर के रूप में इसे छोड़ दे। लेकिन हम यहां जिस चीज से चिंतित हैं वह है विशेषताएं।
गुण जैसे हैं आवृत्ति के चर आप ऑब्जेक्ट डॉट नोटेशन के माध्यम से एक्सेस कर सकते हैं। उदाहरण के लिए, person.name एक व्यक्ति के नाम का उपयोग करेगा। इसी तरह, आप अक्सर विशेषताओं को असाइन कर सकते हैं person.name = "ऐलिस". यह सदस्य चर (जैसे C ++) में एक समान विशेषता है, लेकिन काफी समान नहीं है। यहाँ कुछ खास नहीं चल रहा है, अधिकांश भाषाओं में "गेटर्स" और "सेटर्स", या विधियों को लागू किया जाता है, जो एट्रिब्यूट वेरिएबल्स से विशेषताओं को पुनर्प्राप्त और सेट करते हैं।
रूबी विशेषता प्राप्तकर्ताओं और बसने वालों और सामान्य तरीकों के बीच कोई अंतर नहीं करती है। रूबी के लचीले तरीके से वाक्य रचना को कॉल करने के कारण, कोई भेद करने की आवश्यकता नहीं है। उदाहरण के लिए,
person.name तथा person.name () एक ही बात कर रहे हैं, आप फोन कर रहे हैं नाम शून्य मापदंडों के साथ विधि। एक विधि कॉल की तरह दिखता है और दूसरा एक विशेषता की तरह दिखता है, लेकिन वे वास्तव में एक ही चीज हैं। वे दोनों सिर्फ बुला रहे हैं नाम तरीका। इसी तरह, किसी भी विधि का नाम जो एक समान चिह्न (=) में समाप्त होता है, एक असाइनमेंट में उपयोग किया जा सकता है। बयान person.name = "ऐलिस" वास्तव में के रूप में एक ही बात है person.name = (ऐलिस)भले ही विशेषता नाम और बराबरी के संकेत के बीच एक स्थान है, यह अभी भी कॉल कर रहा है नाम = तरीका।आप आसानी से विशेषताओं को लागू कर सकते हैं। सेटर और गेट्टर विधियों को परिभाषित करके, आप अपनी इच्छानुसार किसी भी विशेषता को लागू कर सकते हैं। यहाँ कुछ उदाहरण कोड लागू है नाम एक व्यक्ति वर्ग के लिए विशेषता। यह एक में नाम संग्रहीत करता है @name उदाहरण चर, लेकिन नाम समान नहीं होना चाहिए। याद रखें, इन तरीकों के बारे में कुछ खास नहीं है।
एक बात जो आप अभी नोटिस करेंगे वह यह है कि यह बहुत काम है। यह कहने के लिए बहुत कुछ टाइप करना है कि आप एक विशेषता नाम चाहते हैं नाम वह पहुंचता है @name उदाहरण चर। सौभाग्य से, रूबी कुछ सुविधा विधियाँ प्रदान करती है जो आपके लिए इन विधियों को परिभाषित करेगी।
में तीन विधियाँ हैं मापांक वह वर्ग जिसे आप अपनी कक्षा की घोषणाओं के अंदर उपयोग कर सकते हैं। याद रखें कि रूबी रनटाइम और "संकलन समय" के बीच कोई अंतर नहीं करता है, और वर्ग घोषणाओं के अंदर कोई भी कोड न केवल तरीकों को परिभाषित कर सकता है बल्कि तरीकों को भी कॉल कर सकता है। बुला रहा है attr_reader, attr_writer और attr_accessor विधियां, बदले में, बसने वाले और पाने वालों को परिभाषित करती हैं जो हम पिछले अनुभाग में खुद को परिभाषित कर रहे थे।
attr_reader विधि को जैसा लगता है वैसा ही करती है। यह किसी भी प्रतीक पैरामीटर की संख्या लेता है और, प्रत्येक पैरामीटर के लिए, एक "गेट्टर" विधि को परिभाषित करता है जो उसी नाम के उदाहरण चर को लौटाता है। इसलिए, हम अपनी जगह ले सकते हैं नाम पिछले उदाहरण में विधि attr_reader: नाम.
इसी तरह, attr_writer विधि एक "सेटर" विधि को परिभाषित करती है जिसमें से प्रत्येक प्रतीक पास होता है। ध्यान दें कि बराबरी के चिन्ह को प्रतीक का हिस्सा नहीं होना चाहिए, केवल विशेषता नाम है। हम बदल सकते हैं नाम = एक कॉल के साथ पिछले उदाहरण से विधि attr_writier: नाम.
और, उम्मीद के मुताबिक, attr_accessor दोनों का काम करता है attr_writer तथा attr_reader. यदि आपको एक विशेषता के लिए एक सेटर और गेट्टर दोनों की आवश्यकता है, तो दो तरीकों को अलग-अलग न कॉल करना और इसके बजाय कॉल करना आम बात है attr_accessor. हम बदल सकते हैं दोनों नाम तथा नाम = एकल कॉल के साथ पिछले उदाहरण के तरीके attr_accessor: नाम.
आपको मैन्युअल रूप से क्यों निर्धारित करना चाहिए? क्यों नहीं इस्तेमाल करते? attr_ * हर बार तरीके? क्योंकि वे अतिक्रमण को तोड़ते हैं। एनकैप्सुलेशन वह प्रिंसिपल है जिसमें कहा गया है कि किसी भी बाहरी संस्था को आपकी आंतरिक स्थिति तक अप्रतिबंधित नहीं होना चाहिए वस्तुओं. एक इंटरफ़ेस का उपयोग करके सब कुछ एक्सेस किया जाना चाहिए जो उपयोगकर्ता को ऑब्जेक्ट की आंतरिक स्थिति को दूषित करने से रोकता है। उपरोक्त विधियों का उपयोग करते हुए, हमने अपनी एनकैप्सुलेशन दीवार में एक बड़ा छेद छिद्रित किया है और एक नाम के लिए पूरी तरह से सेट होने की अनुमति दी है, यहां तक कि अमान्य नाम भी।
एक चीज जो आप अक्सर देखेंगे वह है attr_reader जल्दी से एक गटर को परिभाषित करने के लिए उपयोग किया जाएगा, लेकिन एक कस्टम सेटर को परिभाषित किया जाएगा क्योंकि ऑब्जेक्ट की आंतरिक स्थिति अक्सर बनना चाहती है पढ़ना सीधे आंतरिक अवस्था से। तब सेटर को मैन्युअल रूप से परिभाषित किया जाता है और यह सुनिश्चित करने के लिए जांच करता है कि सेट किया जा रहा मूल्य समझ में आता है। या, शायद अधिक सामान्यतः, कोई भी सेटर निर्धारित नहीं है। क्लास फ़ंक्शन के अन्य तरीकों ने किसी अन्य तरीके से गेटर के पीछे आवृत्ति चर सेट किया।
हम अब एक जोड़ सकते हैं आयु और ठीक से लागू करें नाम विशेषता। आयु कंस्ट्रक्टर विधि में विशेषता सेट की जा सकती है, का उपयोग करके पढ़ें आयु गेट्टर लेकिन केवल का उपयोग कर हेरफेर have_birthday विधि, जो उम्र बढ़ाएगा। नाम विशेषता में एक सामान्य गेटर है, लेकिन सेटर यह सुनिश्चित करता है कि नाम पूंजीकृत है और के रूप में है प्रथम नाम अंतिम नाम.