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