Die Antworten sind teilweise korrekt, da @@ tatsächlich eine Klassenvariable ist, die pro Klassenhierarchie angegeben ist, was bedeutet, dass sie von einer Klasse, ihren Instanzen und ihren untergeordneten Klassen und ihren Instanzen gemeinsam genutzt wird.
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
Dies wird ausgegeben
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Es gibt also nur eine @@ -Variable für Personen-, Studenten- und Abschlussklassen, und alle Klassen- und Instanzmethoden dieser Klassen beziehen sich auf dieselbe Variable.
Es gibt eine andere Möglichkeit, eine Klassenvariable zu definieren, die für ein Klassenobjekt definiert ist (Denken Sie daran, dass jede Klasse tatsächlich eine Instanz von etwas ist, das tatsächlich die Klassenklasse ist, aber es ist eine andere Geschichte). Sie verwenden die @ -Notation anstelle von @@, können jedoch nicht über Instanzmethoden auf diese Variablen zugreifen. Sie benötigen Klassenmethoden-Wrapper.
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(",")
Hier ist @people pro Klasse anstelle der Klassenhierarchie einzeln, da es sich tatsächlich um eine Variable handelt, die in jeder Klasseninstanz gespeichert ist. Dies ist die Ausgabe:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Ein wichtiger Unterschied besteht darin, dass Sie nicht direkt über Instanzmethoden auf diese Klassenvariablen (oder Klasseninstanzvariablen, die Sie sagen können) zugreifen können, da @people in einer Instanzmethode auf eine Instanzvariable dieser bestimmten Instanz der Klassen Person, Student oder Graduate verweisen würde .
Während andere Antworten korrekt angeben, dass @myvariable (mit einfacher @ -Notation) immer eine Instanzvariable ist, bedeutet dies nicht unbedingt, dass es sich nicht um eine einzelne gemeinsam genutzte Variable für alle Instanzen dieser Klasse handelt.