2012-12-19 9 views
20

रूबी में उदाहरण चर के लिए चार अलग-अलग गेटर और सेटर विधियां हैं, attr, attr_reader, attr_writer, और attr_accessor। सवाल यह है कि रूबी attr :dilithium में attr_reader :dilithium के समान है, और attr_accessor :dilithium के समान है यदि कोई अतिरिक्त पैरामीटर सत्य पास हो गया है? यही कारण है कि कहने के लिए है हैएटीआर बनाम attr_accessor

class Enterprise 
    attr :dilithium, true 

class Enterprise 
    attr_accessor :dilithium 

के समान दो कार्य attr और attr_accessor कम या ज्यादा बेमानी हैं?

उत्तर

27

एक अंतर यह है कि attr_accessor और मित्र स्पष्ट हैं, और attr पर वैकल्पिक बूलियन तर्क अब बहिष्कृत है। इसके अलावा, और तथ्य यह है कि attr में कोई प्रलेखन नहीं है, कोई वास्तविक अंतर नहीं है।

+2

'attr' में कम से कम 2.3.0 में दस्तावेज़ हैं। यह सिर्फ 'attr_reader' का उपनाम है। यद्यपि, दस्तावेज व्यवस्थित करने का तरीका बहुत खराब है, इसलिए शायद चीजों को स्पष्ट करने के लिए इसे बेहतर किया जा सकता है। – ioquatix

6

रूबी 1.8, attr एक सेटर बनाने के लिए वैकल्पिक true के साथ केवल एक ही विशेषता को परिभाषित कर सकता है। 1.9 में यह attr_reader जैसा व्यवहार करता है: यह कई विशेषताओं के लिए अनुमति देता है। जैसा कि @ लिनक्सियस कहते हैं, वैकल्पिक बुलियन को बहिष्कृत किया गया है।

1

यदि आप रूबी 2.3.0 में सी कोड देखते हैं, तो आप देखेंगे कि attr और attr_reader वास्तव में वही काम कर रहे हैं (बहिष्कृत कोड पथ को छोड़कर)। वे अनिवार्य रूप से समकक्ष कार्य हैं।

मेरे लिए, मुख्य अंतर हैं:

attr थोड़ा लिख ​​के रूप में यह छोटा है आसान है। मुझे कार्यात्मक/अपरिवर्तनीय प्रोग्रामिंग के संदर्भ में यह भी पसंद है (उन संदर्भों में, attr_writer और attr_accessor अप्रासंगिक हैं और इस प्रकार attr_reader का उपयोग वर्बोज़ और अनावश्यक लगता है)।

attr एकाधिक आवृत्ति चर के साथ दस्तावेज़ों को मुश्किल बनाना, बहुत विशिष्ट परिस्थितियों को छोड़कर, उदा।

# The coordinates in WGS84. 
attr :x, :y 

# The location name. 
attr :name 

# The popularity of the location. 
attr :popularity 

यह :name और :popularity दस्तावेज़ के लिए स्वतंत्र रूप से अगर वे एक ही लाइन attr :name, :popularity पर थे कठिन होगा।

इसके अलावा यह व्यक्तिगत वरीयता तक उबाल जाता है। अभ्यास में कोई प्रदर्शन अंतर या कोई अन्य अंतर नहीं है।

संबंधित मुद्दे