为什么在实现迭代器时会出现"associated type not allowed here"错误?



我想把一个迭代器转换成一个新的迭代器,它产生每一个其他元素,即只有偶数索引的元素。这里有一个尝试:

struct EvenIter<T, I: Iterator<Item = T>> {
inner: I
}
impl<I, T> Iterator<Item = T> for EvenIter<T, I> {
fn next(&mut self) -> Option<T> {
let temp = self.inner.next();
let _ = self.inner.next();
temp
}
}
pub fn evens<T>(iter: impl Iterator<Item = T>) -> impl Iterator<Item = T> {
EvenIter { inner: iter }
}

impl行错误,错误信息

error[E0229]: associated type bindings are not allowed here
--> src/lib.rs:5:21
|
5 | impl<I, T> Iterator<Item = T> for EvenIter<T, I> {
|                     ^^^^^^^^ associated type not allowed here

另一次尝试在完全相同的位置出现完全相同的编译错误:

struct EvenIter<T> {
inner: dyn Iterator<Item = T>
}
impl<T> Iterator<Item = T> for EvenIter<T> {
fn next(&mut self) -> Option<T> {
let temp = self.inner.next();
let _ = self.inner.next();
temp
}
}
pub fn evens<T>(iter: impl Iterator<Item = T>) -> impl Iterator<Item = T> {
EvenIter { inner: iter }
}

我们如何向编译器解释我们想要的内容?

关联项的正确语法是将它们放在impl块中:

struct EvenIter<T, I: Iterator<Item = T>> {
inner: I
}
impl<I: Iterator<Item = T>, T> Iterator for EvenIter<T, I> {
type Item = T; // <-- here
fn next(&mut self) -> Option<T> {
let temp = self.inner.next();
let _ = self.inner.next();
temp
}
}
pub fn evens<T>(iter: impl Iterator<Item = T>) -> impl Iterator<Item = T> {
EvenIter { inner: iter }
}
fn main() {
evens((0..10).into_iter()).for_each(|x| println!("{x}"));
}

还需要对impl中的I进行另一个约束,说明I: Iterator<Item = T>.

相关内容

最新更新