@@는 실제로 클래스 계층 당 클래스 변수이므로 클래스, 해당 인스턴스 및 해당 하위 클래스 및 해당 인스턴스가 공유한다는 의미이므로 부분적으로 정확합니다.
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 클래스에 대해 동일한 @@ variable이 하나만 있으며 이러한 클래스의 모든 클래스 및 인스턴스 메소드는 동일한 변수를 참조합니다.
클래스 객체에 정의 된 클래스 변수를 정의하는 또 다른 방법이 있습니다 (각 클래스는 실제로는 실제로 클래스 클래스이지만 다른 이야기 임). @@ 대신 @ 표기법을 사용하지만 인스턴스 메소드에서 이러한 변수에 액세스 할 수 없습니다. 클래스 메소드 랩퍼가 있어야합니다.
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 (단일 @ 표기법 사용)이 항상 인스턴스 변수라고 명시되어 있지만 반드시 해당 클래스의 모든 인스턴스에 대해 단일 공유 변수가 아님을 의미하지는 않습니다.