CodeBlanks Logo Icon CodeBlanks

Özet - İleri kalıp eşleştirme

Struct, @ ve guard'ı birleştirerek bir renk sınıflandırıcı yazarsın.

İleri kalıp eşleştirme özeti

Kalıplar struct alanlarını sabitlerle süzer ve bağlar, iç içe yapıları tek seferde açar. ad @ kalıp denetler ve bağlar; guard'lar (if) kalıbın ifade edemediği ilişkileri denetler ama kapsayıcılığa sayılmaz. Bağlama modları: taşıma, ref, ref mut; referans üzerinde eşleştirince otomatik seçilir. Dilim kalıpları ([ilk, .., son], [x, kalan @ ..]) dizileri ve vektörleri uzunluğa göre ayırır.

Dilim kalıpları

Dilim kalıpları uzunluğa göre dallanmayı ve uçlara erişmeyi tek yapıda toplar:

fn tanimla(v: &[i32]) -> String {
    match v {
        [] => String::from("boş"),
        [x] => format!("tek: {x}"),
        [ilk, .., son] if ilk == son => format!("uçlar eşit: {ilk}"),
        [ilk, orta @ .., son] => format!("{ilk}..{son} ({} ara)", orta.len()),
    }
}

Kalıp kümesi kapsayıcıdır: boş, tek ve iki-ya-da-daha-fazla durumları her uzunluğu karşılar (guard'lı kol sayılmasa bile son kol kalanları alır).

Uygulama Dilim tanımla

Yukarıdaki tanimla fonksiyonunu yaz. [], [7], [1, 2, 1] ve [1, 2, 3, 4] için sonuçları ayrı satırlara yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn tanimla(v: &[i32]) -> String {
    match v {
        [] => String::from("boş"),
        [x] => format!("tek: {x}"),
        [ilk, .., son] if ilk == son => format!("uçlar eşit: {ilk}"),
        [ilk, orta @ .., son] => format!("{ilk}..{son} ({} ara)", orta.len()),
    }
}

fn main() {
    let girdiler: [&[i32]; 4] = [&[], &[7], &[1, 2, 1], &[1, 2, 3, 4]];
    for v in girdiler {
        println!("{}", tanimla(v));
    }
}

Beklenen çıktı

boş
tek: 7
uçlar eşit: 1
1..4 (2 ara)

Soru ve cevaplar

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

1 <code>[ilk, .., son]</code> kalıbı tek elemanlı bir dilimle eşleşir mi?

  • Panic
  • Derlenmez
  • Hayır; en az iki eleman gerekir Doğru cevap
  • Evet, ilk ve son aynı olur

Açıklama: Adlandırılmış iki konum iki ayrı eleman ister; tek eleman için [x] kolu gerekir.

2 Ortayı bağla

Soru
[ilk, orta ____ .., son] => format!("{} ara", orta.len()),
Cevap
[ilk, orta @ .., son] => format!("{} ara", orta.len()),

Açıklama: orta @ .. ortadaki elemanları bir dilim olarak bağlar.

3 Dilim ve sonuç

Kavram Anlamı
[] boş
[7] tek: 7
[1, 2, 1] uçlar eşit: 1
[1, 2, 3, 4] 1..4 (2 ara)

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