@@は実際にはクラス変数ごとのクラス変数であるため、部分的に正解です。つまり、クラス、そのインスタンス、その子孫クラス、およびそれらのインスタンスによって共有されます。
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が1つだけあり、これらのクラスのすべてのクラスおよびインスタンスメソッドは同じ変数を参照します。
クラスオブジェクトで定義されるクラス変数を定義する別の方法があります(各クラスは実際には実際にはクラスクラスであるもののインスタンスですが、それは別の話です)。@@の代わりに@表記を使用しますが、インスタンスメソッドからこれらの変数にアクセスできません。クラスメソッドラッパーが必要です。
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は実際には各クラスインスタンスに格納されている変数であるため、クラス階層ではなくクラスごとに1つです。これは出力です:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
1つの重要な違いは、インスタンスメソッドの@peopleは、Personクラス、Studentクラス、またはGraduateクラスの特定のインスタンスのインスタンス変数を参照するため、インスタンスメソッドからこれらのクラス変数(または言うことができるクラスインスタンス変数)に直接アクセスできないことです。 。
したがって、他の回答では、@ myvariable(単一の@表記)は常にインスタンス変数であると正しく記述されていますが、必ずしもそのクラスのすべてのインスタンスの単一の共有変数ではないという意味ではありません。