gpt4 book ai didi

rust - 如何实现支持可变迭代器的容器?

转载 作者:行者123 更新时间:2023-11-29 07:53:41 24 4
gpt4 key购买 nike

<分区>

我想设计一个支持可变迭代器的玩具容器类,但我在整理迭代器的生命周期及其对容器的引用时遇到了问题。

我尝试创建一个最小的非编译示例:

struct Payload {
value: i32,
}

struct Container {
val: Payload,
}

struct IterMut<'a> {
cont: &'a mut Container,
cnt: i32,
}

impl<'a> Container {
fn new() -> Container {
Container { val: Payload { value: 42 } }
}
fn iter_mut(&'a mut self) -> IterMut<'a> {
IterMut {
cont: self,
cnt: 10,
}
}
}

impl<'a> Iterator for IterMut<'a> {
type Item = &'a mut Payload;

fn next<'b>(&'b mut self) -> Option<Self::Item> {
self.cnt -= 1;

if self.cnt < 0 {
return None;
} else {
Some(&mut self.cont.val)
}
}
}

fn main() {
let mut cont = Container::new();

let mut it = cont.iter_mut();
it.next();
}

上面的目的是实现一个真正的愚蠢容器,当使用 iter_mut() 迭代时,它会返回相同的项目 10 次。

我不知道如何实现 Iterator::next

我确实设法编写了一个常规函数,它实现了与我想要的 next 相同的语义:

fn manual_next<'a, 'b>(i: &'a mut IterMut<'b>) -> Option<&'a mut Payload> {
i.cnt -= 1;

if i.cnt < 0 {
return None;
} else {
Some(&mut i.cont.val)
}
}

这没有帮助,因为我无法调整它来实现 Iterator::next,而且如果不实现 Iterator,我的容器就不能在我想要的 for 循环中迭代。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com