Jika saya membuat struct yang menyimpan Vec<i32>, saya dapat mengimplementasikan sifat Iterator di atasnya:

struct MyVec2 {
    counter: usize,
    my_vec: Vec<i32>,
}

impl MyVec2 {
    fn new(my_vec: Vec<i32>) -> Self {
        Self { counter: 0, my_vec }
    }
}

impl Iterator for MyVec2 {
    type Item = i32;

    fn next(&mut self) -> Option<Self::Item> {
        let i = self.my_vec.get(self.counter)?;
        self.counter += 1;
        Some(*i)
    }
}

fn main() {
    let mv2 = MyVec2::new(vec![1, 2, 3]);
    for i in mv2 {
        println!("{}", i);
    }
}

Apakah ada cara untuk mengimplementasikan Iterator untuk struct Tuple dari formulir ini?

struct MyVec(Vec<i32>);

Sehingga saya bisa menyebutnya seperti itu?

pub fn main() {
    let mv = MyVec(vec![1, 2, 3]);

    for i in mv {
        println!("{}", i);
    }
}

Semua solusi yang saya coba menghasilkan kesalahan kompiler yang sepertinya tidak bisa saya atasi atau berakhir dengan infinite loop (misalnya saat memanggil .next() pada vektor di dalam metode .next luar ).

Apakah ini bisa dipecahkan?

0
ilmoi 24 Mei 2021, 18:58

1 menjawab

Jawaban Terbaik

Mengikuti saran dalam komentar di atas, saya melanjutkan dan menerapkan struct pembungkus yang berada di sekitar struct Tuple asli, dan memegang penghitung.

pub fn main() {
    let mv = MyVec(vec![1, 2, 3]);

    for i in mv.iter() {
        println!("{}", i);
    }
}

struct MyVec<T>(Vec<T>);

// ---------------- wrapper

struct MyVecIterator<'a, T> {
    counter: usize,
    my_vec: &'a MyVec<T>,
}

impl<'a, T> Iterator for MyVecIterator<'a, T> {
    type Item = &'a T;

    fn next(&mut self) -> Option<Self::Item> {
        let i = self.my_vec.0.get(self.counter)?;
        self.counter += 1;
        Some(i)
    }
}

trait Iter<T> {
    fn iter(&self) -> MyVecIterator<T>;
}

impl<T> Iter<T> for MyVec<T> {
    fn iter(&self) -> MyVecIterator<T> {
        MyVecIterator {
            counter: 0,
            my_vec: self
        }
    }
}

Saya kira jawaban untuk pertanyaan awal saya adalah dapat dipecahkan, tetapi Anda masih memerlukan penghitung di suatu tempat. Harapan membantu siapa pun googling ini di masa depan. Terima kasih atas semua bantuannya!

0
ilmoi 25 Mei 2021, 12:37