Darsliklar Ruby Case (Tanlash operatori)

Ruby Ruby Case (Tanlash operatori)

Case — bitta qiymatni bir nechta variant bilan ketma-ket solishtirish kerak bo’lganda, uzun if...elsif zanjiriga qulay alternativa. Ko’p tillardagi switchning Ruby’dagi analogi, lekin ancha kuchliroq imkoniyatlarga ega.

case / whenbitta ifodani bir nechta when sharti bilan solishtiradigan boshqaruv tuzilmasi. Solishtirish ichki tomondan === operatori orqali amalga oshiriladi, shu sabab whenga son, oraliq (Range) yoki klass ham berilishi mumkin.

Asosiy case…when

Qiymat navbat bilan har bir when bilan solishtiriladi, mos kelgani bajariladi:

kun = "seshanba"

case kun
when "dushanba"
  puts "Hafta boshi"
when "seshanba", "chorshanba", "payshanba"
  puts "Hafta o'rtasi"
when "juma"
  puts "Ish haftasi oxiri"
else
  puts "Dam olish kuni"
end
Hafta o'rtasi

Bitta when qatoriga vergul bilan bir nechta qiymat yozish mumkin — ular “yoki” mantig’ida ishlaydi. else — hech biriga mos kelmasa ishga tushadigan yakuniy shoxobcha.

Range bilan case

whenga Range berilsa, qiymat oraliqqa kiradimi tekshiriladi — bu ko’plab oraliq shartlarni yozishning eng toza usuli:

baho = 82

natija = case baho
         when 90..100 then "A'lo"
         when 70...90 then "Yaxshi"
         when 50...70 then "Qoniqarli"
         else "Qoniqarsiz"
         end

puts natija
Yaxshi

Bu yerda case natijasi to’g’ridan-to’g’ri natija o’zgaruvchisiga o’zlashtirildi — Ruby’da case ham, if kabi, o’zi bir qiymat qaytaradigan ifoda hisoblanadi. then — bir qatorli when shartida blokni ochish uchun ishlatiladi.

Klass bilan case

whenga klass nomi berilsa, qiymat o’sha klassga tegishli ekanligi tekshiriladi:

[42, "matn", 3.14, true].each do |qiymat|
  case qiymat
  when Integer then puts "#{qiymat} — butun son"
  when String then puts "#{qiymat} — satr"
  when Float then puts "#{qiymat} — kasr son"
  else puts "#{qiymat} — boshqa tur"
  end
end
42 — butun son
matn — satr
3.14 — kasr son
true — boshqa tur

Bu ishlashi sababi — Integer === 42 chaqiruvi qiymat aynan shu klassning nusxasi ekanligini tekshiradi. Xuddi shu mexanizm oldingi darsdagi Range misolida ham ishladi: (90..100) === baho.

when’siz case

Ba’zan case shartsiz, faqat ketma-ket mantiqiy ifodalarni tekshirish uchun ham ishlatiladi:

harorat = 5

holat = case
        when harorat < 0 then "muzlash"
        when harorat < 15 then "sovuq"
        when harorat < 25 then "salqin"
        else "issiq"
        end

puts holat
sovuq

Bu shaklda case ifodasiz yoziladi, har bir when esa o’zi mustaqil shart bo’ladi — natijada uzun if...elsif zanjiriga tartibli muqobil hosil bo’ladi.