Ответы частично верны, потому что @@ на самом деле является переменной класса для каждой иерархии классов, что означает, что она является общей для класса, его экземпляров и классов-потомков и их экземпляров.
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, но это другая история). Вы используете @ нотацию вместо @@, но вы не можете получить доступ к этим переменным из методов экземпляра. Вы должны иметь обертки метода класса.
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 (с одиночной нотацией @) всегда является переменной экземпляра, это не обязательно означает, что это не одна общая переменная для всех экземпляров этого класса.