微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以为包含向量的元组结构使用 Impl 迭代器?

如何解决是否可以为包含向量的元组结构使用 Impl 迭代器?

如果我创建一个包含 Vec<i32> 的结构,我可以在其上实现 Iterator 特征:

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);
    }
}

有没有办法为这种形式的元组结构实现 Iterator

struct MyVec(Vec<i32>);

这样我就可以这样称呼它?

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

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

我尝试过的所有解决方案要么产生了我似乎无法绕过的编译器错误,要么最终陷入了无限循环(例如,在外部 {{1} 内的向量上调用 .next() 时}} 方法)。

这能解决吗?

解决方法

按照上面评论中的建议,我继续实现了一个包装结构,它位于原始元组结构周围,并保持一个计数器。

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
        }
    }
}

我想我最初的问题的答案是它是可以解决的,但你仍然需要一个计数器。希望可以帮助任何人在未来使用谷歌搜索。感谢大家的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。