जावा कोडर द्वारा रूबी में आने वाली यह एक आम गलती है, और बड़े वैचारिक कूदों में से एक को मुझे अपना सिर मिलना पड़ा। सबसे पहले यह अजीब लगता है, लेकिन यह वास्तव में रूबी के कूलर पहलुओं में से एक है - सभी कोड कक्षा परिभाषाओं सहित निष्पादन योग्य है।
तो, विधियों के अंदर आवृत्ति चर घोषित किया जाना चाहिए। इसे 'आत्म' का मूल्यांकन कैसे किया जाता है इसके साथ करना है। 'स्वयं' वर्तमान वस्तु है। दुभाषिया 'स्वयं' में पहली विधि कॉल और वैरिएबल संदर्भ देखने देगा:
class Fish
@var = "foo" # here 'self' == Fish, the constant which contains the class object
def foo
# do foo
end
end
fish = Fish.new
fish.foo # here 'self' == fish, an instance of Fish
एक वर्ग परिभाषा में, 'स्वयं' वर्ग वस्तु परिभाषित किया जा रहा है, तो एक वर्ग परिभाषा के दायरे में कोई संदर्भ का उल्लेख होगा होने के लिए सेट कर दिया जाता उस वर्ग वस्तु, इस मामले में मछली।
जब मछली के उदाहरण पर एक विधि कहा जाता है, हालांकि, स्वयं को कॉल का रिसीवर, मछली का विशेष उदाहरण माना जाता है। तो एक विधि परिभाषा के बाहर, स्वयं कक्षा वस्तु है। एक विधि के अंदर, स्वयं रिसीवर का उदाहरण है। यही कारण है कि एक विधि परिभाषा के बाहर @var जावा में स्थिर चर की तरह है, और एक विधि परिभाषा के अंदर @var एक आवृत्ति चर है। - कोई इनिशियलाइज़ ओवरराइड करने के लिए की जरूरत
class Fish
class << self
attr_accessor :var
end
@var = 'fish'
def v
self.class.var
end
end
class Trout < Fish
@var = 'trout'
end
class Salmon < Fish
@var = 'salmon'
end
puts (Trout.new).v # => trout
puts (Salmon.new).v # => salmon
सूचना उपवर्गीकरण केवल एक @var
जोड़ने की आवश्यकता है कि:
स्रोत
2010-01-18 14:57:14
नहीं करना चाहिए ' टी कोड के पहले ब्लॉक में @@ var हो? – Jean
मैं डेविड ब्लैक द्वारा "द वेल-ग्राउंडेड रूबीस्ट" (http://manning.com/black2/) पढ़ रहा हूं। वह इस क्षेत्र में सभी बारीकियों को समझाते हुए एक महान काम करता है –
जीन: नहीं। अगर मैंने '@@ var' का उपयोग किया तो उप-वर्ग अभिभावक वर्गों को ओवरराइड कर देगा। होबोडेव का लिंक देखें। विशेष रूप से उदाहरण में '2' कैसे ओवरराइड किया जाता है। –