दिलचस्प पोस्ट
MySQL डाटाबेस में अरबी में डेटा सहेजें IOS 6 SDK और Xcode 4.5 के साथ armv6 वास्तुकला (लक्ष्य आईओएस 3.1.3) का निर्माण करें? idleTimerDisabled iPhone 3.0 के बाद से काम नहीं कर रहा है मैं अपने खुद के मूल अनुप्रयोग के भीतर से Google मानचित्र iPhone एप्लिकेशन कैसे लॉन्च कर सकता हूं? घुमाओ JToolbar बटन दबाने पायथन / मेटप्ललिब: एक 3 डी क्यूब, एक गोलाकार और एक वेक्टर की साजिश रचने वाला? एंड्रॉइड के साथ वेबव्यू में वीडियो कैसे खेलें? कैसे एक दृश्य बनाने के लिए जो स्क्रीन से बड़ा है? AngularJS और इसके डॉलर के उपयोग के मूल्यों सर्वलेट रिटर्न "HTTP स्थिति 404 अनुरोधित संसाधन (/ servlet) उपलब्ध नहीं है" Android पर सूची दृश्य के शीर्ष पर नई आइटम जोड़ें? पहली संकलन त्रुटि पर स्वचालित रूप से Visual C ++ 2008 बिल्ड बंद करें? पढ़ें: जावास्क्रिप्ट के साथ छद्म वर्ग को हॉवर करें धूमधाम में कुकीज़ के बिना सहायक सत्र बेहतर रूबी मार्केटन इंटरप्रिटर?

रूबी के attr_accessor, attr_reader और attr_writer का उपयोग क्यों करें?

रूबी की तरह चाबियाँ का उपयोग करके उदाहरण चर को साझा करने के लिए यह आसान और सुविधाजनक तरीका है

attr_accessor :var attr_reader :var attr_writer :var 

अगर मैं सिर्फ attr_accessor उपयोग कर सकता हूं तो मैं attr_reader या attr_writer क्यों attr_accessor ? क्या प्रदर्शन की तरह कुछ है (मुझे संदेह है)? मुझे लगता है कि एक कारण है, अन्यथा वे इस तरह की चाबियाँ नहीं बनाते।

Solutions Collecting From Web of "रूबी के attr_accessor, attr_reader और attr_writer का उपयोग क्यों करें?"

आप अपने ऐड्रेस को पढ़ने के लिए अलग-अलग एक्सेसर्स का इस्तेमाल कर सकते हैं, और किसी भी तरह से क्लासेस लिख सकते हैं जो कि सही तरीके से काम करेंगे, इससे कोई फर्क नहीं पड़ता कि उनकी सार्वजनिक एपीआई कहां है।

 class Person attr_accessor :age ... end 

यहां, मैं देख सकता हूं कि मैं उम्र पढ़ा और लिख सकता हूं।

 class Person attr_reader :age ... end 

यहां, मैं देख सकता हूं कि मैं केवल उम्र पढ़ सकता हूं। कल्पना करो कि यह इस वर्ग के निर्माता द्वारा निर्धारित किया गया है और उसके बाद स्थिर रहता है यदि उम्र के लिए एक mutator (लेखक) थे और कक्षा को यह मान लिया गया कि उम्र, एक बार सेट की गई है, तो बदल नहीं पाता है, तो एक बग कोड के परिणामस्वरूप बदल सकता है जो म्यूटेटर कहता है।

लेकिन पर्दे के पीछे क्या हो रहा है?

यदि आप लिखते हैं:

 attr_writer :age 

इसका अनुवादः

 def age=(value) @age = value end 

यदि आप लिखते हैं:

 attr_reader :age 

इसका अनुवादः

 def age @age end 

यदि आप लिखते हैं:

 attr_accessor :age 

इसका अनुवादः

 def age=(value) @age = value end def age @age end 

यह जानने के लिए, यहां इसके बारे में सोचने का एक और तरीका है: अगर आपके पास एट्रिट नहीं हैं, तो सहायक, और खुद को एक्सेसर्स लिखना पड़ता है, क्या आप अपने क्लास की तुलना में किसी भी अधिक एक्सेसर्स लिखेंगे? उदाहरण के लिए, यदि उम्र केवल पढ़ने की जरूरत होती है, तो क्या आप इसे लिखे जाने की अनुमति देने वाला एक तरीका भी लिखेंगे?

ऊपर दिए गए सभी उत्तर सही हैं; attr_reader और attr_writer मैन्युअल रूप से उन तरीकों को टाइप करने से लिखना अधिक सुविधाजनक है, attr_writer वे attr_writer हैं। इसके अलावा वे विधि परिभाषा को खुद लिखने की तुलना में बेहतर प्रदर्शन प्रदान करते हैं अधिक जानकारी के लिए, हारून पैटरसन द्वारा इस बातचीत ( पीडीएफ ) से 152 आगे स्लाइड देखें

ऑब्जेक्ट के सभी गुणों को सीधे कक्षा के बाहर से सेट नहीं किया जाता है आपके सभी उदाहरण चर के लिए लेखकों को आम तौर पर कमजोर encapsulation का संकेत और एक चेतावनी है कि आप अपनी कक्षाओं के बीच बहुत अधिक युग्मन शुरू कर रहे हैं।

एक व्यावहारिक उदाहरण के रूप में: मैंने एक डिज़ाइन प्रोग्राम लिखा था जहां आप कंटेनरों के अंदर आइटम डालते थे आइटम में attr_reader :container था attr_reader :container , लेकिन लेखक का प्रस्ताव समझने में कोई मतलब नहीं था क्योंकि चूंकि आइटम के कंटेनर को बदलना चाहिए, जब वह एक नए में रखा जाता है, जिसके लिए पोजीशनिंग जानकारी की आवश्यकता होती है।

आप हमेशा अपने आवृत्ति चर वर्ग से बाहर से पूरी तरह से सुलभ नहीं होना चाहते हैं। ऐसे बहुत सारे मामले हैं जहां एक आवृत्ति चर को पढ़ने की अनुमति मिलती है, लेकिन यह लिखना संभव नहीं है (उदाहरण के लिए एक मॉडल जो केवल पढ़ने के लिए स्रोत से डेटा प्राप्त करता है)। ऐसे मामले हैं जहां आप विपरीत चाहते हैं, लेकिन मैं उन किसी भी चीज के बारे में सोच भी नहीं सकता जो मेरे सिर के शीर्ष पर नहीं हैं।

यह समझना महत्वपूर्ण है कि एक्सेसर्स वेरिएबल तक पहुंच को प्रतिबंधित करते हैं, लेकिन उनकी सामग्री नहीं। रूबी में, कुछ अन्य ओओ भाषाओं में की तरह, प्रत्येक चर एक उदाहरण के लिए एक सूचक है। इसलिए यदि आपके पास एक हैश के लिए एक विशेषता है, उदाहरण के लिए, और आप इसे "केवल पढ़ने" के लिए सेट करते हैं तो आप हमेशा इसकी सामग्री बदल सकते हैं, लेकिन संकेतक की सामग्री नहीं। इसे देखो:

 irb(main):024:0> class A irb(main):025:1> attr_reader :a irb(main):026:1> def initialize irb(main):027:2> @a = {a:1, b:2} irb(main):028:2> end irb(main):029:1> end => :initialize irb(main):030:0> a = A.new => #<A:0x007ffc5a10fe88 @a={:a=>1, :b=>2}> irb(main):031:0> aa => {:a=>1, :b=>2} irb(main):032:0> aadelete(:b) => 2 irb(main):033:0> aa => {:a=>1} irb(main):034:0> aa = {} NoMethodError: undefined method `a=' for #<A:0x007ffc5a10fe88 @a={:a=>1}> from (irb):34 from /usr/local/bin/irb:11:in `<main>' 

जैसा कि आप देख सकते हैं, संभव हैश @ ए से एक कुंजी / मान युगल को हटा दें, जैसा कि नई कुंजियां जोड़ें, मूल्य बदलें, एकेटरिया लेकिन आप एक नए ऑब्जेक्ट को इंगित नहीं कर सकते क्योंकि केवल एक पठन केवल इंस्टेंस चर है।