Darsliklar Ruby Symbol

Ruby Ruby Symbol

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:nom shaklida 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.