Hello, everyone I've just started learning Rust and wanted to understand lifetimes a bit better. The example of my custom iterator, I attached below, works well. But I wanted to also implement the From trait so I could create an instance with .into
.
let some_vec = vec![1, 2, 3];
// TODO: make the Into imlemenation work
// let mut my_custom_vec: MyVecIterator<i32> = my_vec.into();
let mut my_custom_vec: MyVecIterator<i32> = MyVecIterator::new(&some_vec);
The full example is below and also on
(a Playground)
trait MyIterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
fn is_done(&mut self) -> bool;
}
struct MyVecIterator<'a, T> {
data: &'a Vec<T>,
current: usize,
}
impl<'a, T> MyVecIterator<'a, T> {
pub fn new(data: &'a Vec<T>) -> Self {
Self { data, current: 0 }
}
}
impl<'a, T> MyIterator for MyVecIterator<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
let current_idx = self.current;
let current_item = self.data.get(current_idx);
self.current += 1;
current_item
}
fn is_done(&mut self) -> bool {
self.current == self.data.len()
}
}
// TODO: implement lifetimes correctly
// impl<'a, T> From<Vec<T>> for MyVecIterator<'a, T> {
// fn from (data: Vec<T>) -> Self {
// Self::new(&data)
// }
// }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let some_vec = vec![1, 2, 3];
// TODO: make the Into imlemenation work
// let mut my_custom_vec: MyVecIterator<i32> = my_vec.into();
let mut my_custom_vec: MyVecIterator<i32> = MyVecIterator::new(&some_vec);
assert_eq!(my_custom_vec.is_done(), false);
assert_eq!(my_custom_vec.next(), Some(&1));
assert_eq!(my_custom_vec.is_done(), false);
assert_eq!(my_custom_vec.next(), Some(&2));
assert_eq!(my_custom_vec.is_done(), false);
assert_eq!(my_custom_vec.next(), Some(&3));
assert_eq!(my_custom_vec.is_done(), true);
assert_eq!(my_custom_vec.next(), None);
}
}