Symbol — Ruby’ga xos, boshqa ko’plab tillarda to’g’ridan-to’g’ri analogi bo’lmagan tur. Tashqi ko’rinishidan satrga o’xshaydi (:ism), lekin ichki tabiati va ishlatilish maqsadi butunlay boshqacha — u o’zgarmas identifikator sifatida xizmat qiladi.
Symbol —
:nomshaklida yoziladigan, o’zgarmas (immutable) va xotirada bir marta saqlanadigan identifikator klassi. Bir xil nomli ikki symbol doim bitta obyektga ishora qiladi.
Symbol va String farqi
Ikkalasi ham matn ko’rinishida bo’lsa-da, xotira darajasida tubdan farq qiladi:
a = :ism
b = :ism
x = "ism"
y = "ism"
puts a.equal?(b)
puts x.equal?(y)
true
false
Bir xil nomli ikkita symbol (:ism) doim bitta xuddi shu obyekt — chunki Ruby symbollarni ichki jadvalda bir marta saqlaydi (interning). Ikkita bir xil satr ("ism") esa har safar yangi obyekt sifatida yaratiladi. Shu sababli symbol String’ga qaraganda xotira va tezlik jihatidan samaraliroq.
O’zgarmaslik (immutability)
Symbol’ni, String’dan farqli o’laroq, joyida o’zgartirib bo’lmaydi — unda << yoki upcase! kabi metodlar mavjud emas:
ism = :farrux
puts ism.frozen?
puts ism.class
true
Symbol
frozen? — obyekt o’zgarmasligini tasdiqlaydi. Har bir Symbol avtomatik “muzlatilgan” holatda yaratiladi, shuning uchun u xavfsiz, o’zgarmas kalit sifatida ishlatilaveradi.
Symbol’ning eng ko’p uchraydigan qo’llanilishi — Hash kalitlari
Oldingi darsda ko’rganimizdek, Hash kalitlarida symbol ustunlik qiladi — bu tasodifiy emas:
sozlama = {til: "uz", tema: "qorong'i"}
puts sozlama.class
puts sozlama.keys.first.class
Hash
Symbol
Kalitlar tez-tez solishtiriladi (hash[:til] chaqirilganda), va symbol’lar String’ga qaraganda tezroq solishtiriladi — chunki ular obyekt sifatida bir xilligini equal? darajasida, ya’ni bevosita xotira manzili orqali tekshirish mumkin.
String va Symbol’ni o’zaro o’girish
Kerak bo’lganda ikkalasi orasida erkin o’tish mumkin:
satr = "dasturlash"
symbol = satr.to_sym
qaytgan_satr = symbol.to_s
puts symbol.inspect
puts qaytgan_satr.inspect
:dasturlash
"dasturlash"
to_sym — satrni symbol’ga, to_s — symbol’ni satrga aylantiradi. Bu, masalan, foydalanuvchidan matn sifatida kelgan ma’lumotni Hash kaliti sifatida ishlatishda kerak bo’ladi.