if let bilan Control Flow

if let sintaksisi sizga if va let ni birlashtirib, qolganlarini e'tiborsiz qoldirib, bitta patternga mos keladigan qiymatlarni boshqarishning kamroq batafsil metodiga imkon beradi. 6-6 ro'yxatdagi dasturni ko'rib chiqaylik, u max_sozlama o'zgaruvchisidagi Variant<u8> qiymatiga mos keladigan, lekin Some varianti boʻlsagina kodni bajarishni xohlaydigan dasturni koʻrib chiqamiz.

fn main() {
    let max_sozlama = Some(3u8);
    match max_sozlama {
        Some(max) => println!("Maksimal {} qilib sozlangan", max),
        _ => (),
    }
}

Ro'yxat 6-6. Qiymat Some bo'lsagina kodni bajaradigan match ifoda

Agar qiymat Some bo'lsa, biz qiymatni patterndagi max o'zgaruvchisiga bog'lash orqali Some variantidagi qiymatni chop qilamiz. Biz None qiymati bilan hech narsa qilishni xohlamaymiz. match ifodasini qondirish uchun faqat bitta variantni qayta ishlagandan so‘ng _ => () qo‘shishimiz kerak, bu esa qo‘shish uchun zerikarli boilerplate koddir.

Buning o'rniga, biz buni qisqaroq qilib if let yordamida yozishimiz mumkin. Quyidagi kod 6-6 ro'yxatdagi match bilan bir xil ishlaydi:

fn main() {
    let max_sozlama = Some(3u8);
    if let Some(max) = max_sozlama {
        println!("Maksimal {} qilib sozlangan", max);
    }
}

if let sintaksisi teng belgisi bilan ajratilgan pattern va ifodani oladi. U xuddi match bilan ishlaydi, bunda ifoda matchga beriladi va pattern uning birinchi armi hisoblanadi. Bunday holda, pattern Some(max) bo'lib, max Some ichidagi qiymatga bog'lanadi. Shundan so'ng biz if let blokining tanasida max dan xuddi mos keladigan match armida max dan foydalanganimiz kabi foydalanishimiz mumkin. Qiymat patternga mos kelmasa, if let blokidagi kod ishga tushmaydi.

if let dan foydalanish kamroq yozish, kamroq chekinish va kamroq kodli kodni bildiradi. Biroq, siz match amal qiladigan to'liq tekshirishni yo'qotasiz. match va if let o‘rtasida tanlov qilish sizning muayyan vaziyatingizda nima qilayotganingizga va ixchamlikka ega bo‘lish to‘liq tekshirishni yo‘qotish uchun to‘g‘ri kelishilganligiga bog‘liq.

Boshqacha qilib aytganda, siz if let konstruktsiyasini match uchun sintaktik shakar sifatida o'ylab ko'rishingiz mumkin, agar kiritilgan qiymat bitta patterga mos kelsa va boshqa barcha qiymatlarga e'tibor bermasa, kodni bajaradi.

Biz elseni if let bilan kiritishimiz mumkin. else bilan birlashtirilgan kod bloki if let va elsega ekvivalent bo‘lgan match ifodasidagi _ registriga mos keladigan kod bloki bilan bir xil. 6-4 roʻyxatdagi Tanga definitionni eslang, bunda Quarter varianti ham UsState qiymatiga ega edi. Agar biz quarterlarning holatini e'lon qilishda ko'rgan barcha quarter bo'lmagan tangalarni sanashni istasak, buni quyidagi kabi match ifodasi bilan qilishimiz mumkin:

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Tanga {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn main() {
    let tanga = Tanga::Penny;
    let mut hisobchi = 0;
    match tanga {
        Tanga::Quarter(shtat) => println!("{:?} dan shtat kvartal!", shtat),
        _ => hisobchi += 1,
    }
}

Yoki if let va else ifodalaridan foydalanishimiz mumkin, masalan:

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Tanga {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn main() {
    let tanga = Tanga::Penny;
    let mut hisobchi = 0;
    if let Tanga::Quarter(shtat) = tanga {
        println!("{:?} dan shtat kvartal!", shtat);
    } else {
        hisobchi += 1;
    }
}

Agar dasturingizda match yordamida ifodalash uchun juda batafsil mantiq mavjud bo'lsa, Rust toolboxda if let ham mavjudligini unutmang.

Xulosa

Endi biz sanab o'tilgan qiymatlar to'plamidan biri bo'lishi mumkin bo'lgan maxsus turlarni yaratish uchun enumlardan qanday foydalanishni ko'rib chiqdik. Biz standart kutubxonaning Option<T> turi xatolarni oldini olish uchun type tizimidan qanday foydalanishni ko'rsatdik. Enum qiymatlari ichida ma'lumotlar mavjud bo'lsa, siz qancha holatlarni ko'rib chiqishingiz kerakligiga qarab, ushbu qiymatlarni ajratib olish va ishlatish uchun match yoki if let dan foydalanishingiz mumkin.

Rust dasturlaringiz endi structlar va enumlar yordamida domeningizdagi tushunchalarni ifodalashi mumkin. API-da foydalanish uchun maxsus turlarni yaratish turdagi xavfsizligini ta'minlaydi: kompilyator sizning funksiyalaringiz faqat har bir funktsiya kutgan turdagi qiymatlarni olishiga ishonch hosil qiladi.

Foydalanuvchilaringizga foydalanish uchun qulay va faqat sizning foydalanuvchilarga nima kerakligini aniq ko'rsatadigan yaxshi tashkil etilgan API taqdim etish uchun endi Rust modullariga murojaat qilaylik.