我有以下代码(参见链接),我想实现一个trait来返回一个迭代器:
trait MyTrait<V> {
type Iter: Iterator<Item = V>;
fn produce_iter(&self) -> Self::Iter;
}
struct MyStruct<V> {
values: Vec<V>,
}
impl<V> MyTrait<V> for MyStruct<V>
where
V: Clone,
{
type Iter = std::vec::IntoIter<V>;
fn produce_iter(&self) -> Self::Iter {
self.values.clone().into_iter()
}
}
fn main() {
let s = MyStruct {
values: vec![1, 2, 3],
};
s.produce_iter().for_each(|v| println!("{:?}", v));
}
然而,如果我想让我的fn produce_iter(&self)
实现更加复杂,例如
fn produce_iter(&mut self) -> Self::Iter {
self.values
.clone()
.into_iter()
.flat_map(|v| vec![v, v].into_iter())
.into_iter()
}
替代
fn produce_iter(&mut self) -> Self::Iter {
self.values.clone().into_iter()
}
我遇到了
error[E0308]: mismatched types
问题,试图弄清楚 type Iter = std::vec::IntoIter<V>;
应该改成什么。有没有一种“泛型化”错误的方法,使得
fn produce_iter(&self)
可以产生任意复杂的迭代器,而不必担心我为 type Iter
设置了什么?也许我应该从不同的角度看待这个问题?
impl
返回来隐藏复杂性。但是由于存在关联类型,在这种情况下我不知道有什么解决方法。 - Silvio MayoloVec
时,您可以使用数组代替vec!
,并优先使用iter().cloned()
而不是.clone().into_iter()
。 - Chayim Friedman