Cevaplar kısmen doğrudur, çünkü @@ aslında sınıf hiyerarşisi başına bir sınıf değişkeni, yani bir sınıf, örnekleri ve onun soyundan gelen sınıflar ve örnekleri tarafından paylaşılır.
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
Bu çıktı
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Kişi, Öğrenci ve Lisansüstü dersleri için sadece bir @@ değişkeni vardır ve bu sınıfların tüm sınıf ve örnek yöntemleri aynı değişkeni ifade eder.
Bir sınıf nesnesinde tanımlanan bir sınıf değişkenini tanımlamanın başka bir yolu daha vardır (Her sınıfın aslında Sınıf sınıfı olan bir şeyin örneği olduğunu, ancak başka bir hikaye olduğunu unutmayın). @@ yerine @ notasyonu kullanıyorsunuz ancak bu değişkenlere örnek yöntemlerinden erişemiyorsunuz. Sınıf yöntemi sarmalayıcılarına sahip olmanız gerekir.
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(",")
Burada, @people sınıf hiyerarşisi yerine sınıf başına tektir, çünkü aslında her sınıf örneğinde depolanan bir değişkendir. Bu çıktı:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Önemli bir fark, bu sınıf değişkenlerine (veya söyleyebileceğiniz sınıf örneği değişkenlerine) doğrudan örnek yöntemlerinden erişememenizdir, çünkü bir örnek yöntemindeki @people, Kişi veya Öğrenci veya Lisansüstü sınıflarının belirli bir örneğinin örnek değişkenine atıfta bulunur .
Diğer cevaplar doğru bir şekilde @ myvariable (single @ notation ile) ifadesinin her zaman bir örnek değişkeni olduğunu belirtmekle birlikte, bu sınıfın tüm örnekleri için tek bir paylaşılan değişken olmadığı anlamına gelmez.