Відповіді частково правильні, оскільки @@ насправді є змінною класу, яка відповідає ієрархії класів, тобто її розділяють клас, його екземпляри та його нащадкові класи та їх інстанції.
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
Це виведе
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Отже, існує лише одна і та сама змінна @@ для класів Person, Student і Graduate, і всі методи класів і екземплярів цих класів відносяться до однієї і тієї ж змінної.
Існує ще один спосіб визначення змінної класу, визначеної на об’єкті класу (Пам'ятайте, що кожен клас насправді є екземпляром чогось, що є насправді класом Class, але це вже інша історія). Ви використовуєте @ notation замість @@, але не можете отримати доступ до цих змінних з методів екземпляра. Потрібно мати обгортки методу класу.
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(",")
Тут @people є одиничним для класу замість ієрархії класів, оскільки це фактично змінна, що зберігається у кожному екземплярі класу. Це вихід:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Важлива відмінність полягає в тому, що ви не можете отримати доступ до цих змінних класів (або змінних екземплярів класу, які ви можете сказати) безпосередньо з методів екземпляра, оскільки @people в методі екземпляра буде посилатися на змінну екземпляра цього конкретного примірника класів Person або Student або Graduate. .
Отже, хоча інші відповіді правильно стверджують, що @myvariable (з одиночним @ notation) завжди є змінною екземпляра, це не обов'язково означає, що це не єдина загальна змінна для всіх екземплярів цього класу.