Apa variabel Ruby yang didahului dengan double at Sign ( @@
)? Pemahaman saya tentang variabel yang didahului dengan tanda at adalah bahwa itu adalah variabel instan, seperti ini di PHP:
Versi PHP
class Person {
public $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
Setara dengan Ruby
class Person
def set_name(name)
@name = name
end
def get_name()
@name
end
end
Apa arti ganda pada tanda @@
, dan bagaimana perbedaannya dari satu pada tanda?
@
di dalamself
) bukan variabel kelas (@@
). Lihat litani alasan mengapa dalam jawaban di bawah ini.Jawaban:
Variabel awalan dengan
@
adalah variabel instan , sedangkan satu awalan dengan@@
adalah variabel kelas . Lihatlah contoh berikut; outputnya ada di komentar di akhirputs
baris:Anda dapat melihat yang
@@shared
dibagikan di antara kelas-kelas; pengaturan nilai pada instance dari satu mengubah nilai untuk semua instance lain dari kelas itu dan bahkan kelas anak, di mana variabel bernama@shared
, dengan satu@
, tidak akan.[Memperbarui]
Seperti yang disebutkan Phrogz dalam komentar, itu adalah idiom umum di Ruby untuk melacak data tingkat kelas dengan variabel instan pada kelas itu sendiri . Ini bisa menjadi subjek yang rumit untuk membungkus pikiran Anda, dan ada banyak bacaan tambahan tentang subjek, tetapi menganggapnya sebagai memodifikasi
Class
kelas, tetapi hanya contohClass
kelas yang Anda kerjakan. Sebuah contoh:Saya menyertakan
Square
contoh (output mananil
) untuk menunjukkan bahwa ini mungkin tidak berperilaku 100% seperti yang Anda harapkan; yang artikel saya terkait di atas memiliki banyak informasi tambahan pada subjek.Juga perlu diingat bahwa, seperti pada sebagian besar data, Anda harus sangat berhati-hati dengan variabel kelas dalam lingkungan multithreaded , sesuai komentar dmarkow.
sumber
ruby class << self end
blok, khususnya operator <<.class << self
melihat ini@
- Variabel Instance dari suatu kelas@@
- Variabel kelas, juga disebut sebagai variabel statis dalam beberapa kasusVariabel kelas adalah variabel yang dibagi di antara semua instance kelas. Ini berarti bahwa hanya satu nilai variabel yang ada untuk semua objek yang dipakai dari kelas ini. Jika satu instance objek mengubah nilai variabel, nilai baru itu pada dasarnya akan berubah untuk semua instance objek lainnya.
Cara berpikir lain untuk memikirkan variabel kelas adalah sebagai variabel global dalam konteks kelas tunggal. Variabel kelas dideklarasikan dengan mengawali nama variabel dengan dua
@
karakter (@@
). Variabel kelas harus diinisialisasi pada waktu pembuatansumber
@@
menunjukkan variabel kelas, yaitu itu dapat diwarisi.Ini berarti bahwa jika Anda membuat subkelas dari kelas itu, itu akan mewarisi variabel. Jadi jika Anda memiliki kelas
Vehicle
dengan variabel kelas@@number_of_wheels
maka jika Anda membuatnyaclass Car < Vehicle
maka juga akan memiliki variabel kelas@@number_of_wheels
sumber
Vehicle
dengan variabel kelas@@number_of_wheels
maka jika Anda membuatnyaclass Car < Vehicle
maka juga akan memiliki variabel kelas@@number_of_wheels
class Vehicle
dengan@number_of_wheels
, makaclass Car < Vehicle
juga akan memiliki variabel instan bernama@number_of_wheels
. Perbedaan utama dengan variabel kelas adalah bahwa kelas memiliki variabel yang sama , misalnya mengubah satu mengubah yang lain.@ dan @@ dalam modul juga bekerja secara berbeda ketika kelas diperluas atau termasuk modul itu.
Jadi diberikan
Maka Anda mendapatkan output di bawah ini ditampilkan sebagai komentar
Jadi gunakan modul @@ in untuk variabel yang Anda inginkan umum untuk semua penggunaannya, dan gunakan modul @ in untuk variabel yang ingin Anda pisahkan untuk setiap konteks penggunaan.
sumber
Jawabannya sebagian benar karena @@ sebenarnya adalah variabel kelas yang per hierarki kelas artinya dibagi oleh kelas, instance dan kelas turunannya dan instance mereka.
Ini akan menampilkan
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.
Di sini, @people adalah satu per kelas, bukan hierarki kelas karena sebenarnya merupakan variabel yang disimpan pada setiap instance kelas. Ini hasilnya:
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.
sumber