คำตอบนั้นถูกต้องเพียงบางส่วนเนื่องจาก @@ เป็นตัวแปรคลาสซึ่งเป็นลำดับชั้นตามความหมายซึ่งแบ่งใช้โดยคลาสอินสแตนซ์และคลาสที่สืบทอดและอินสแตนซ์ของพวกเขา
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>
ดังนั้นจึงมีตัวแปร @@ เหมือนกันเพียงตัวเดียวสำหรับคลาส Person, Student และบัณฑิตและวิธีการเรียนและอินสแตนซ์ทั้งหมดของคลาสเหล่านี้อ้างอิงถึงตัวแปรเดียวกัน
มีอีกวิธีหนึ่งในการกำหนดตัวแปรคลาสซึ่งกำหนดไว้ในคลาสอ็อบเจ็กต์ (โปรดจำไว้ว่าแต่ละคลาสนั้นเป็นตัวอย่างของสิ่งที่เป็นคลาสคลาส แต่เป็นอีกเรื่องหนึ่ง) คุณใช้ @ สัญกรณ์แทน @@ แต่คุณไม่สามารถเข้าถึงตัวแปรเหล่านี้ได้จากวิธีการอินสแตนซ์ คุณต้องมีวิธีการห่อคลาส
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(",")
ที่นี่ @people เป็นแบบเดี่ยวต่อคลาสแทนที่จะเป็นลำดับชั้นของคลาสเนื่องจากเป็นตัวแปรที่เก็บอยู่ในแต่ละอินสแตนซ์ของคลาส นี่คือผลลัพธ์:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
ความแตกต่างที่สำคัญอย่างหนึ่งคือคุณไม่สามารถเข้าถึงตัวแปรคลาสเหล่านี้ (หรือตัวแปรอินสแตนซ์ของคลาสที่คุณสามารถพูด) ได้โดยตรงจากวิธีการของอินสแตนซ์เนื่องจาก @people ในวิธีการอินสแตนซ์จะอ้างถึงตัวแปรอินสแตนซ์ของ .
ดังนั้นในขณะที่คำตอบอื่น ๆ อย่างถูกต้องระบุว่า @myvariable (ด้วยเครื่องหมาย @ เดียว) เป็นตัวแปรอินสแตนซ์เสมอมันไม่จำเป็นต้องหมายความว่ามันไม่ใช่ตัวแปรที่แชร์เดียวสำหรับทุกอินสแตนซ์ของคลาสนั้น