Jawabannya sebagian benar karena @@ sebenarnya adalah variabel kelas yang per hierarki kelas artinya dibagi oleh kelas, instance dan kelas turunannya dan instance mereka.
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
Ini akan menampilkan
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Jadi hanya ada satu variabel @@ yang sama untuk kelas Person, Mahasiswa dan Pascasarjana dan semua metode kelas dan instance dari kelas-kelas ini merujuk ke variabel yang sama.
Ada cara lain untuk mendefinisikan variabel kelas yang didefinisikan pada objek kelas (Ingat bahwa setiap kelas sebenarnya adalah instance dari sesuatu yang sebenarnya adalah kelas Kelas tetapi itu adalah cerita lain). Anda menggunakan @ notasi alih-alih @@ tetapi Anda tidak dapat mengakses variabel-variabel ini dari metode instan. Anda harus memiliki pembungkus metode kelas.
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(",")
Di sini, @people adalah satu per kelas, bukan hierarki kelas karena sebenarnya merupakan variabel yang disimpan pada setiap instance kelas. Ini hasilnya:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Satu perbedaan penting adalah bahwa, Anda tidak dapat mengakses variabel kelas ini (atau variabel instance kelas yang dapat Anda katakan) langsung dari metode instance karena @people dalam metode instance akan merujuk ke variabel instance dari instance spesifik dari kelas Person atau Mahasiswa atau pascasarjana tersebut .
Jadi, sementara jawaban lain dengan benar menyatakan bahwa @myvariable (dengan notasi tunggal @) selalu merupakan variabel instan, itu tidak berarti bahwa itu bukan variabel tunggal yang dibagi untuk semua instance dari kelas itu.