// example on how to implement iterators struct VecIntoIter { v: Vec, len: usize, i: usize, } impl VecIntoIter { fn new(v: Vec) -> Self { Self { len: v.len(), v, i: 0 } } } struct VecIter<'a, T> { v: &'a Vec, len: usize, i: usize, } impl<'a, T> VecIter<'a, T> { fn new(v: &'a Vec) -> Self { Self { len: v.len(), v, i: 0 } } } impl<'a, T> Iterator for VecIter<'a, T> { type Item = &'a T; fn next(&mut self) -> Option { if self.i >= self.len { return None; } let n = self.i; self.i += 1; Some(&self.v[n]) } } impl Iterator for VecIntoIter { type Item = T; fn next(&mut self) -> Option { if self.i >= self.len { return None; } let n = self.i; self.i += 1; Some(self.v[n]) } } fn main() { let v = vec![1, 2, 3]; let mut it = VecIter::new(&v); while let Some(x) = it.next() { println!("{x}"); } println!("{v:?}"); let mut it = VecIntoIter::new(v); while let Some(x) = it.next() { println!("{x}"); } // println!("{v:?}"); // v is consumed }