Iterator ile işleme
- Rust kursu
- Orta seviye
- Ders 63/115
- 6 dk
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
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
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
.enumerate()
.____(|(_, n)| n.to_lowercase().contains(&s))
.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 |