CodeBlanks Logo Icon CodeBlanks

Iterator ile işleme

Komutları iterator ile zincirlersin.

Iterator ile işleme

Arama komutu, notları numaralarıyla birlikte süzmelidir. enumerate ve filter zinciri bunu ara koleksiyon oluşturmadan yapar:

impl Defter {
    fn ara(&self, sorgu: &str) -> Vec<(usize, &String)> {
        let s = sorgu.to_lowercase();
        self.notlar
            .iter()
            .enumerate()
            .filter(|(_, n)| n.to_lowercase().contains(&s))
            .map(|(i, n)| (i + 1, n))
            .collect()
    }
}

Numarayı filter'dan önce eklemek önemlidir; aksi halde gösterilen numara notun gerçek sırasını yansıtmaz.

Özet istatistik

Yineleyiciler kısa raporlar için de idealdir:

let toplam_karakter: usize = d.notlar.iter().map(|n| n.chars().count()).sum();
let en_uzun = d.notlar.iter().max_by_key(|n| n.chars().count());
println!("{} not, {} karakter, en uzun: {:?}",
    d.notlar.len(), toplam_karakter, en_uzun);

Uygulama Notlarda ara

Defter'e ara metodunu ekle. "süt al", "kod yaz", "süt faturası" notlarını ekleyip ara("süt") sonuçlarını N. not biçiminde yazdır.

Başlangıç kodu

main.rs
struct Defter {
    notlar: Vec<String>,
}

impl Defter {
    fn new() -> Self {
        Self { notlar: Vec::new() }
    }
    fn ekle(&mut self, metin: String) {
        self.notlar.push(metin);
    }
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Defter {
    notlar: Vec<String>,
}

impl Defter {
    fn new() -> Self {
        Self { notlar: Vec::new() }
    }
    fn ekle(&mut self, metin: String) {
        self.notlar.push(metin);
    }
}

impl Defter {
    fn ara(&self, sorgu: &str) -> Vec<(usize, &String)> {
        let s = sorgu.to_lowercase();
        self.notlar
            .iter()
            .enumerate()
            .filter(|(_, n)| n.to_lowercase().contains(&s))
            .map(|(i, n)| (i + 1, n))
            .collect()
    }
}

fn main() {
    let mut d = Defter::new();
    for n in ["süt al", "kod yaz", "süt faturası"] {
        d.ekle(n.to_string());
    }
    for (i, n) in d.ara("süt") {
        println!("{}. {}", i, n);
    }
}

Beklenen çıktı

1. süt al
3. süt faturası

Soru ve cevaplar

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

1 <code>filter</code>'dan sonra <code>enumerate</code> çağrılsaydı ne olurdu?

  • Numaralar yalnızca eşleşenler arasında 1, 2, 3 diye sayılırdı Doğru cevap
  • Derleme hatası
  • Sonuç değişmezdi
  • Panic

Açıklama: Bağdaştırıcıların sırası anlamı değiştirir; sil komutu gerçek numarayı istediği için enumerate önce gelmeli.

2 Eşleşenleri süz

Soru
.enumerate()
.____(|(_, n)| n.to_lowercase().contains(&s))
Cevap
.enumerate()
.filter(|(_, n)| n.to_lowercase().contains(&s))

Açıklama: filter koşula uyan (numara, not) ikililerini tutar.

3 Sorgu ve eşleşen numaralar

Kavram Anlamı
"süt" 1, 3
"KOD" 2
"fatura" 3
"çay" Yok

Orta seviye bölümündeki tüm dersler