Operatorlar mavzusini tizimli yakunlaymiz. Arifmetik amallarni sonlar darsida, solishtirish va mantiqiy operatorlarni esa Boolean darsida ko’rgan edik. Bu darsda o’zlashtirish operatorlarining Ruby’ga xos shakllarini, tenglikning uch darajasini va shartli ifoda operatorlarini ko’rib chiqamiz.
Operator — bir yoki bir necha operand ustida amal bajaradigan belgi. Ruby’da ko’plab operatorlar aslida — masalan,
+,==— tegishli klassda e’lon qilingan oddiy metodlardir.
O’zlashtirish operatorlari va ||=
Oddiy qisqartma o’zlashtirishdan tashqari (+=, -=), Ruby’da ||= (“or-equals”) juda ko’p ishlatiladi — u faqat o’zgaruvchi hali nil yoki false bo’lsagina yangi qiymat beradi:
sozlama = nil
sozlama ||= "standart qiymat"
puts sozlama
sozlama ||= "boshqa qiymat"
puts sozlama
standart qiymat
standart qiymat
Birinchi qatorda sozlama nil edi, shuning uchun ||= yangi qiymat berdi. Ikkinchi chaqiruvda sozlama allaqachon rost qiymatga ega bo’lgani uchun o’zgarmadi. Bu naqsh sozlamalarga standart qiymat berishda keng qo’llaniladi.
Uch darajali tenglik: ==, eql?, equal?
Ruby’da qiymatlarni solishtirishning uchta aniq darajasi bor — ular ko’pincha adashtiriladi, lekin ma’nosi butunlay boshqa:
a = 5
b = 5.0
puts a == b # qiymat jihatdan teng
puts a.eql?(b) # qiymat va klass ham teng bo'lishi kerak
puts a.equal?(5) # aynan bir obyektmi
true
false
true
== faqat qiymatni solishtiradi (5 va 5.0 matematik jihatdan teng). eql? esa qattiqroq — qiymat teng bo’lishi bilan birga klass ham bir xil bo’lishi kerak (Integer va Float — turli klass, shu sabab false). equal? esa eng qattiq — ikkala o’zgaruvchi xotirada aynan bitta obyektga ishora qilishini tekshiradi. Oddiy diapazondagi Integer qiymatlar Ruby’da alohida xotira manzili bilan emas, “immediate value” sifatida saqlanadi — shuning uchun bir xil qiymatli ikkita Integer doim bitta obyekt hisoblanadi va equal? true qaytaradi.
Spaceship operatori <=>
<=> (spaceship operatori) ikki qiymatni solishtirib, natijani bitta sonda qaytaradi — bu saralash algoritmlarining asosi:
puts (5 <=> 10)
puts (10 <=> 10)
puts (15 <=> 10)
-1
0
1
Chap qiymat kichik bo’lsa -1, teng bo’lsa 0, katta bo’lsa 1 qaytadi. sort kabi metodlar ichida aynan shu operator ishlatiladi — o’z klassingizda <=> metodini aniqlasangiz, obyektlaringizni avtomatik saralay olasiz.
Shartli ifoda operatori (ternary)
if...else ning qisqa shakli — bitta qatorda shart asosida qiymat tanlash uchun ishlatiladi:
yosh = 20
holat = yosh >= 18 ? "voyaga yetgan" : "voyaga yetmagan"
puts holat
voyaga yetgan
shart ? rost_qiymat : yolgon_qiymat shakli to’liq if...else blokidan ixchamroq, lekin faqat oddiy, bir qatorlik qarorlar uchun mos — murakkab mantiq to’liq if bloki bilan yozilishi kerak, aks holda kod o’qilishi qiyinlashadi.