Le risposte sono parzialmente corrette perché @@ è in realtà una variabile di classe che è per gerarchia di classi, il che significa che è condivisa da una classe, dalle sue istanze e dalle sue classi discendenti e dalle loro istanze.
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
Questo produrrà
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Quindi esiste solo una stessa variabile @@ per le classi Persona, Studente e Laureato e tutti i metodi di classe e istanza di queste classi si riferiscono alla stessa variabile.
C'è un altro modo di definire una variabile di classe che è definita su un oggetto di classe (Ricorda che ogni classe è in realtà un'istanza di qualcosa che è in realtà la classe di classe ma è un'altra storia). Si utilizza @ notation anziché @@ ma non è possibile accedere a queste variabili dai metodi di istanza. È necessario disporre di wrapper con metodo di classe.
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(",")
Qui, @people è singolo per classe anziché gerarchia di classi perché in realtà è una variabile memorizzata su ogni istanza di classe. Questo è l'output:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Una differenza importante è che non puoi accedere a queste variabili di classe (o variabili di istanza di classe che puoi dire) direttamente dai metodi di istanza perché @people in un metodo di istanza farebbe riferimento a una variabile di istanza di quella specifica istanza delle classi Persona o Studente o Laurea .
Quindi, mentre altre risposte affermano correttamente che @myvariable (con singola @ notazione) è sempre una variabile di istanza, ciò non significa necessariamente che non sia una singola variabile condivisa per tutte le istanze di quella classe.