Las respuestas son parcialmente correctas porque @@ es en realidad una variable de clase que es por jerarquía de clase, lo que significa que es compartida por una clase, sus instancias y sus clases descendientes y sus instancias.
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
Esto dará salida
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Por lo tanto, solo hay una misma variable @@ para las clases Persona, Estudiante y Graduado y todos los métodos de clase e instancia de estas clases se refieren a la misma variable.
Hay otra forma de definir una variable de clase que se define en un objeto de clase (recuerde que cada clase es en realidad una instancia de algo que en realidad es la clase Class pero es otra historia). Utiliza la notación @ en lugar de @@ pero no puede acceder a estas variables desde los métodos de instancia. Necesita tener envoltorios de métodos de clase.
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(",")
Aquí, @people es individual por clase en lugar de jerarquía de clases porque en realidad es una variable almacenada en cada instancia de clase. Esta es la salida:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Una diferencia importante es que no puede acceder a estas variables de clase (o variables de instancia de clase que puede decir) directamente desde los métodos de instancia porque @people en un método de instancia se referiría a una variable de instancia de esa instancia específica de las clases Person o Student o Graduate .
Entonces, mientras que otras respuestas indican correctamente que @myvariable (con notación simple @) siempre es una variable de instancia, no significa necesariamente que no sea una sola variable compartida para todas las instancias de esa clase.