gpt4 book ai didi

rust - 如何为引用自身但不改变自身的迭代器的关联类型指定生命周期?

转载 作者:行者123 更新时间:2023-11-29 08:02:28 26 4
gpt4 key购买 nike

我有这个结构:

struct RepIter<T> {
item: T
}

我想为它实现Iterator,以便它每次都返回对其item的引用:

impl<T> Iterator for RepIter<T> {
type Item = &T;
fn next(&mut self) -> Option<Self::Item> {
return Some(&self.item);
}
}

这不会编译,因为必须为 type Item = &T; 指定生命周期。在寻找执行此操作的方法时,我找到了 this question .第一个解决方案似乎不适用,因为我正在实现一个预先存在的特征。尝试直接复制第二个解决方案,我得到这样的结果:

impl<'a, T> Iterator for &'a RepIter<T> {
type Item = &'a T;
fn next(self) -> Option<&'a T> {
return Some(&self.item);
}
}

这也不起作用,因为我需要一个可变的 self 作为 next 的参数。我能够让它编译的唯一方法是这样写:

impl<'a, T> Iterator for &'a RepIter<T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
return Some(&self.item);
}
}

但是现在 self 是对引用的引用,对吧?我不知道如何在 RepIter 实例上调用 next。例如,这不起作用:

fn main() {
let mut iter: RepIter<u64> = RepIter { item: 5 };
let res = iter.next();
}

这让我觉得我的 trait 实现可以用更好的方式编写。

最佳答案

正如在 question 中讨论的那样Shepmaster 链接到,这有点棘手,因为您真的想更改 next() 的类型,但你不能,因为它是特征的一部分。不过,有几种方法可以解决这个问题。

对您的代码进行最少的更改,您可以只使用 Iterator&'a RepIter<T> 上实现:

pub fn main() {
let mut iter = RepIter { item: 5 };
let res = (&iter).next();
}

虽然有点不愉快。

另一种看待这个问题的方法是改变你的元素的所有权。如果它已经被借用,那么你可以让所有类型很好地匹配:

struct RepIter<'a, T: 'a> {
item: &'a T,
}

impl<'a, T> Iterator for RepIter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
Some(&self.item)
}
}

pub fn main() {
let val: u64 = 5;
let mut iter = RepIter { item: &val };
let res = iter.next();
}

关于rust - 如何为引用自身但不改变自身的迭代器的关联类型指定生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44747543/

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