As respostas estão parcialmente corretas porque @@ é realmente uma variável de classe que é por hierarquia de classes, o que significa que é compartilhada por uma classe, suas instâncias e suas classes descendentes e suas instâncias.
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
Isso produzirá
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Portanto, existe apenas uma mesma variável @@ para as classes Person, Student e Graduate e todos os métodos de classe e instância dessas classes se referem à mesma variável.
Existe outra maneira de definir uma variável de classe que é definida em um objeto de classe (lembre-se de que cada classe é na verdade uma instância de algo que na verdade é a classe Class, mas é outra história). Você usa a notação @ em vez de @@, mas não pode acessar essas variáveis nos métodos da instância. Você precisa ter wrappers de método 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(",")
Aqui, @people é único por classe, em vez de hierarquia de classes, porque na verdade é uma variável armazenada em cada instância de classe. Esta é a saída:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Uma diferença importante é que, você não pode acessar essas variáveis de classe (ou variáveis de instância de classe, você pode dizer) diretamente dos métodos de instância, porque @people em um método de instância se refere a uma variável de instância dessa instância específica das classes Person, Student ou Graduate .
Portanto, enquanto outras respostas afirmam corretamente que @myvariable (com notação @ única) é sempre uma variável de instância, isso não significa necessariamente que não é uma única variável compartilhada para todas as instâncias dessa classe.