जवाबों:
लेखन @age
सीधे उदाहरण चर तक पहुँचता है @age
। लेखन self.age
खुद को संदेश भेजने के लिए वस्तु बताता है age
, जो आमतौर पर उदाहरण चर को वापस कर देगा @age
- लेकिन किसी भी age
उप-वर्ग में कैसे विधि लागू की जाती है , इसके आधार पर किसी भी अन्य चीजों की संख्या कर सकता है । उदाहरण के लिए, आपके पास एक MiddleAgedSocialite वर्ग हो सकता है जो हमेशा अपनी उम्र 10 वर्ष से कम उम्र की रिपोर्ट करता है जो वास्तव में है। या अधिक व्यावहारिक रूप से, एक PersistentPerson वर्ग आलसी रूप से उस डेटा को लगातार स्टोर से पढ़ सकता है, अपने सभी स्थायी डेटा को हैश में कैश कर सकता है।
अंतर यह है कि यह इसके कार्यान्वयन से विधि के उपयोग को अलग कर रहा है। यदि संपत्ति के कार्यान्वयन को बदलना था - तो जन्मतिथि रखने के लिए कहें और फिर अब और जन्मतिथि के बीच के अंतर के आधार पर उम्र की गणना करें - फिर विधि के आधार पर कोड को बदलने की आवश्यकता नहीं है। यदि यह सीधे संपत्ति का उपयोग करता है, तो परिवर्तन को कोड के अन्य क्षेत्रों में प्रचार करने की आवश्यकता होगी। इस अर्थ में, क्लास द्वारा प्रदान किए गए इंटरफ़ेस का उपयोग करने की तुलना में सीधे संपत्ति का उपयोग करना अधिक नाजुक है।
सावधान रहें जब आप एक वर्ग से वारिस Struct.new
पैदा करते हैं, जो एक इंटेस्टाइज़र बनाने का एक अच्छा तरीका है ( रूबी में इनिशियलाइज़र कैसे उत्पन्न करें? )
class Node < Struct.new(:value)
def initialize(value)
@value = value
end
def show()
p @value
p self.value # or `p value`
end
end
n = Node.new(30)
n.show()
वापस होगा
30
nil
हालाँकि, जब आप इनिलाइज़र को निकालते हैं, तो यह वापस आ जाएगा
nil
30
वर्ग की परिभाषा के साथ
class Node2
attr_accessor :value
def initialize(value)
@value = value
end
def show()
p @value
p self.value
end
end
आपको कंस्ट्रक्टर प्रदान करना चाहिए।
n2 = Node2.new(30)
n2.show()
वापस होगा
30
30
पहला उत्तर पूरी तरह से सही है, लेकिन एक रिश्तेदार नौसिखिया के रूप में यह मेरे लिए तुरंत स्पष्ट नहीं था कि यह क्या निहित है (स्वयं को संदेश भेजना? उह हुह ...)। मुझे लगता है कि एक छोटा उदाहरण मदद करेगा:
class CrazyAccessors
def bar=(val)
@bar = val - 20 # sets @bar to (input - 20)
end
def bar
@bar
end
def baz=(value)
self.bar = value # goes through `bar=` method, so @bar = (50 - 20)
end
def quux=(value)
@bar = value # sets @bar directly to 50
end
end
obj = CrazyAccessors.new
obj.baz = 50
obj.bar # => 30
obj.quux = 50
obj.bar # => 50
कोई अंतर नहीं है। मुझे संदेह है कि यह सिर्फ देखने self.age
और other_person.age
एक-दूसरे के पास के दस्तावेजी मूल्य के लिए किया गया था ।
मुझे लगता है कि उपयोग भविष्य में एक वास्तविक गटर लिखने की अनुमति देता है, जो केवल एक उदाहरण चर की तुलना में कुछ अधिक जटिल कर सकता है, और उस मामले में विधि को बदलने की आवश्यकता नहीं होगी।
लेकिन, इस बारे में चिंता करने की संभावना नहीं है कि आखिरकार, यदि वस्तु का कार्यान्वयन बदल गया है तो अन्य तरीकों को बदलना उचित है, कुछ बिंदु पर वस्तु के भीतर एक साधारण संदर्भ ही पूरी तरह से उचित है।
किसी भी मामले में, age
संपत्ति का अमूर्त उपयोग अभी भी स्पष्ट उपयोग की व्याख्या नहीं करता है self
, क्योंकि सिर्फ सादे age
ने भी एक्सेसर को आमंत्रित किया होगा।
@age - निश्चित रूप से उदाहरण चर आयु है
self.age - उदाहरण का तात्पर्य संपत्ति की आयु से है।