उत्तर आंशिक रूप से सही हैं क्योंकि @@ वास्तव में एक वर्ग चर है जो प्रति वर्ग पदानुक्रम है जिसका अर्थ है कि यह एक वर्ग, उसके उदाहरणों और उसके वंशजों और उनके उदाहरणों द्वारा साझा किया जाता है।
class Person
@@people = []
def initialize
@@people << self
end
def self.people
@@people
end
end
class Student < Person
end
class Graduate < Student
end
Person.new
Student.new
puts Graduate.people
यह आउटपुट करेगा
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
इसलिए व्यक्ति, छात्र और स्नातक कक्षाओं के लिए केवल एक ही @ चर है और इन वर्गों के सभी वर्ग और उदाहरण विधियाँ एक ही चर को संदर्भित करती हैं।
एक वर्ग चर को परिभाषित करने का एक और तरीका है जो एक वर्ग वस्तु पर परिभाषित किया गया है (याद रखें कि प्रत्येक वर्ग वास्तव में कुछ का एक उदाहरण है जो वास्तव में कक्षा वर्ग है लेकिन यह एक और कहानी है)। आप @@ के बजाय @ नोटेशन का उपयोग करते हैं, लेकिन आप इन चर को उदाहरण के तरीकों से एक्सेस नहीं कर सकते। आपको क्लास मेथ रैपर लगाने की जरूरत है।
class Person
def initialize
self.class.add_person self
end
def self.people
@people
end
def self.add_person instance
@people ||= []
@people << instance
end
end
class Student < Person
end
class Graduate < Student
end
Person.new
Person.new
Student.new
Student.new
Graduate.new
Graduate.new
puts Student.people.join(",")
puts Person.people.join(",")
puts Graduate.people.join(",")
यहाँ, @ लोग वर्ग पदानुक्रम के बजाय प्रति वर्ग एकल हैं क्योंकि यह वास्तव में प्रत्येक वर्ग उदाहरण पर संग्रहीत एक चर है। यह आउटपुट है:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
एक महत्वपूर्ण अंतर यह है कि, आप इन क्लास वेरिएबल्स (या क्लास इंस्टेंस वेरिएबल्स जो आप कह सकते हैं) को सीधे इंस्टेंस मेथड्स से एक्सेस नहीं कर सकते हैं क्योंकि @ एंप्लीमेंट मेथड पर्सन या स्टूडेंट या ग्रेजुएट क्लासेज के उस विशिष्ट इंस्टेंस के इंस्टेंस वेरिएबल को संदर्भित करेगा। ।
इसलिए जब अन्य उत्तर सही ढंग से बताते हैं कि @myvariable (सिंगल @ नोटेशन के साथ) हमेशा एक उदाहरण चर है, तो इसका मतलब यह नहीं है कि यह उस वर्ग के सभी उदाहरणों के लिए एक साझा साझा चर नहीं है।