Iterator traiti
- Rust kursu
- Orta seviye
- Ders 48/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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>&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ü
impl Iterator for Geri {
type ____ = u32;
fn next(&mut self) -> Option<u32> { .. }
}
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 |