दिलचस्प पोस्ट
CodeIgniter में pconnect विकल्प के फायदे / नुकसान ऐप हमेशा पृष्ठभूमि राज्य (ज्ञात बग) को चालू करने के बजाय रूट गतिविधि से ताज़ा शुरू होता है कैसे jQuery का उपयोग कर सभी सीएसएस वर्गों को दूर करने के लिए? SQL सर्वर: कुछ दिनों के लिए कोई डेटा मौजूद नहीं है, तो किसी तिथि सीमा में सभी दिनों का चयन कैसे करें छवि बनाम zImage vs uImage मैं एक जेफ्राम के अंदर जेपीएनएल कैसे बदलूं? dplyr का उपयोग करते हुए data.frame में पूर्ण मामलों के लिए फ़िल्टर करें (केस-वार विलोपन) एफएटीटी, ईओएफ की जांच फ़ाइल एक्सटेंशन का उपयोग करके C # का उपयोग करें फ़ायरबेज क्लाउड मेसेजिंग को क्लिक_ऑक्शन भेजें यूआरएल में अजाक्स अनुरोध कैसे दिखाना है? PHP के माध्यम से एक जावास्क्रिप्ट फाइल पार्स करें जावा में सूची बनाम मानचित्र NSString से वर्ण निकालें? सरणी जावास्क्रिप्ट / jquery के लिए इनपुट फ़ाइल

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

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

attr_accessor :var attr_reader :var attr_writer :var 

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

वेब के समाधान से एकत्रित समाधान "रूबी के 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>' 

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