Les réponses sont partiellement correctes car @@ est en fait une variable de classe qui est par hiérarchie de classes, ce qui signifie qu'elle est partagée par une classe, ses instances et ses classes descendantes et leurs instances.
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
Cela produira
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Il n'y a donc qu'une seule variable @@ pour les classes Person, Student et Graduate et toutes les méthodes de classe et d'instance de ces classes font référence à la même variable.
Il existe une autre façon de définir une variable de classe qui est définie sur un objet de classe (rappelez-vous que chaque classe est en fait une instance de quelque chose qui est en fait la classe de classe mais c'est une autre histoire). Vous utilisez la notation @ au lieu de @@ mais vous ne pouvez pas accéder à ces variables à partir des méthodes d'instance. Vous devez avoir des wrappers de méthode de 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(",")
Ici, @people est unique par classe au lieu de la hiérarchie de classes car il s'agit en fait d'une variable stockée sur chaque instance de classe. Voici la sortie:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Une différence importante est que vous ne pouvez pas accéder à ces variables de classe (ou variables d'instance de classe que vous pouvez dire) directement à partir des méthodes d'instance, car @people dans une méthode d'instance ferait référence à une variable d'instance de cette instance spécifique des classes Person, Student ou Graduate .
Ainsi, alors que d'autres réponses indiquent correctement que @myvariable (avec une seule notation @) est toujours une variable d'instance, cela ne signifie pas nécessairement qu'il ne s'agit pas d'une seule variable partagée pour toutes les instances de cette classe.