CodeBlanks Logo Icon CodeBlanks

Iterator traiti

Iterator trait'ini uygulayarak kendi iteratörünü yazarsın.

Iterator trait'i

Rust'taki tüm yineleyiciler tek bir trait'i uygular. Zorunlu tek metot next'tir; diğer onlarca yöntem (map, filter, sum...) varsayılan olarak gelir:

trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
    // map, filter, sum, collect ... varsayılan metotlar
}

type Item bir ilişkili türdür: yineleyicinin ne ürettiğini söyler. next sıradaki elemanı Some içinde, bitince None döndürür.

Kendi yineleyicin

Bir struct'a Iterator uygulayınca tüm yineleyici yöntemleri ücretsiz kazanılır:

struct Geri {
    n: u32,
}

impl Iterator for Geri {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        if self.n == 0 {
            return None;
        }
        self.n -= 1;
        Some(self.n + 1)
    }
}

let v: Vec<u32> = Geri { n: 3 }.collect();   // [3, 2, 1]

Uygulama Geri sayım

Yukarıdaki Geri yineleyicisini yaz. Geri { n: 3 } elemanlarını Vec<u32>'ye topla ve {:?} ile yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Geri {
    n: u32,
}

impl Iterator for Geri {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        if self.n == 0 {
            return None;
        }
        self.n -= 1;
        Some(self.n + 1)
    }
}

fn main() {
    let v: Vec<u32> = Geri { n: 3 }.collect();
    println!("{:?}", v);
}

Beklenen çıktı

[3, 2, 1]

Soru ve cevaplar

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

1 <code>next</code> neden <code>&amp;mut self</code> alır?

  • Elemanları silmek için
  • Bir gelenek; gerekmez
  • Thread güvenliği için
  • Yineleyici her çağrıda iç konumunu ilerletir Doğru cevap

Açıklama: Yineleyici durum tutar (nerede kaldığını); next bu durumu değiştirir.

2 Eleman türü

Soru
impl Iterator for Geri {
    type ____ = u32;
    fn next(&mut self) -> Option<u32> { .. }
}
Cevap
impl Iterator for Geri {
    type Item = u32;
    fn next(&mut self) -> Option<u32> { .. }
}

Açıklama: Iterator'ın ilişkili türü Item'dır.

3 Parça ve anlamı

Kavram Anlamı
type Item Üretilen tür
fn next Zorunlu metot
Some(x) Sıradaki eleman
None Bitti

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