CodeBlanks Logo Icon CodeBlanks

Destructuring

Tuple ve struct destructuring yöntemlerini öğrenirsin.

Destructuring

Kalıplar iç içe geçebilir: tuple içinde struct, enum içinde tuple... Tek bir kalıp karmaşık bir değeri tek seferde açar:

enum Olay {
    Tik { konum: (i32, i32) },
    Tus(char),
}

match olay {
    Olay::Tik { konum: (x, y) } => println!("tık {x},{y}"),
    Olay::Tus(c) => println!("tuş {c}"),
}

let ((a, b), Nokta { x, .. }) = ((1, 2), Nokta { x: 5, y: 9 });

let, fonksiyon parametreleri ve for döngüleri de kalıp kabul eder: fn f(&(a, b): &(i32, i32)), for (i, (ad, puan)) in liste.iter().enumerate().

Döngüde açma

Kalıplar, ikililerden ve iç içe yapılardan oluşan koleksiyonlarla çalışmayı çok okunaklı yapar:

let puanlar = vec![("ece", (90, 85)), ("can", (70, 95))];
for (ad, (vize, final_)) in &puanlar {
    let ort = (vize + final_) / 2;
    println!("{ad}: {ort}");
}

final bir anahtar kelime olarak ayrıldığı için değişken adı final_ yazılır (ya da r#final).

Uygulama Olayları işle

Yukarıdaki Olay enum'ını yaz. Olay::Tik { konum: (3, 4) } ve Olay::Tus('a') içeren bir vektörü dolaşıp her olayı iç içe kalıplarla açarak ayrı satırlara yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
enum Olay {
    Tik { konum: (i32, i32) },
    Tus(char),
}

fn main() {
    let olaylar = vec![Olay::Tik { konum: (3, 4) }, Olay::Tus('a')];
    for olay in &olaylar {
        match olay {
            Olay::Tik { konum: (x, y) } => println!("tık {},{}", x, y),
            Olay::Tus(c) => println!("tuş {}", c),
        }
    }
}

Beklenen çıktı

tık 3,4
tuş a

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>let</code> ile hangi kalıplar kullanılabilir?

  • Yalnızca tanımlayıcı
  • Yalnızca tuple
  • Reddedilemez kalıplar; her değere uyanlar (tuple, struct). Diğerleri için let-else Doğru cevap
  • Her kalıp

Açıklama: let Some(x) = v; derlenmez çünkü None durumunu karşılamaz; let Some(x) = v else { .. }; yazılır.

2 İç içe açma

Soru
match olay {
    Olay::Tik { konum: ____ } => println!("tık {x},{y}"),
    Olay::Tus(c) => println!("tuş {c}"),
}
Cevap
match olay {
    Olay::Tik { konum: (x, y) } => println!("tık {x},{y}"),
    Olay::Tus(c) => println!("tuş {c}"),
}

Açıklama: Tuple alanı (x, y) kalıbıyla açılır.

3 Kalıp ve bağlananlar

Kavram Anlamı
((a, b), _) a, b
Olay::Tik { konum: (x, y) } x, y
Nokta { x, .. } Yalnızca x
(ad, (vize, final_)) Üç değişken

İleri seviye bölümündeki tüm dersler