Destructuring
- Rust kursu
- İleri seviye
- Ders 73/81
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
match olay {
Olay::Tik { konum: ____ } => println!("tık {x},{y}"),
Olay::Tus(c) => println!("tuş {c}"),
}
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 |