Odpowiedzi są częściowo poprawne, ponieważ @@ jest w rzeczywistości zmienną klasową, która jest według hierarchii klas, co oznacza, że jest wspólna dla klasy, jej instancji i jej klas podrzędnych oraz ich instancji.
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
To wyjdzie
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Jest więc tylko jedna ta sama zmienna @@ dla klas Person, Student i Graduate, a wszystkie metody klas i instancji tych klas odwołują się do tej samej zmiennej.
Istnieje inny sposób definiowania zmiennej klasy, która jest zdefiniowana w obiekcie klasy (pamiętaj, że każda klasa jest w rzeczywistości instancją czegoś, co w rzeczywistości jest klasą Class, ale jest to inna historia). Używasz notacji @ zamiast @@, ale nie możesz uzyskać dostępu do tych zmiennych z metod instancji. Musisz mieć opakowania metod klas.
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(",")
Tutaj @people jest pojedyncza na klasę, a nie w hierarchii klas, ponieważ w rzeczywistości jest to zmienna przechowywana w każdej instancji klasy. Oto wynik:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Jedną ważną różnicą jest to, że nie można uzyskać dostępu do tych zmiennych klas (lub zmiennych instancji klasy, które można powiedzieć) bezpośrednio z metod instancji, ponieważ @people w metodzie instancji odwołuje się do zmiennej instancji tej konkretnej instancji klas Person, Student lub Graduate .
Tak więc, podczas gdy inne odpowiedzi poprawnie stwierdzają, że @myvariable (z pojedynczą notacją @) jest zawsze zmienną instancji, nie musi to oznaczać, że nie jest to pojedyncza zmienna wspólna dla wszystkich instancji tej klasy.