下面是我制作的一个小程序示例:
type Index = usize;
type ValType = u32;
#[derive(Debug)]
pub struct NewVec(pub Vec<ValType>);
impl IntoIterator for NewVec {
type Item = (Index, ValType);
type IntoIter = <Vec<(Index, ValType)> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.0
.into_iter()
.enumerate()
.collect::<Vec<_>>()
.into_iter()
}
}
fn main() {
let v = vec![100];
let new_v = NewVec(v.clone());
println!("Vec::into_iter: {:?}", v.into_iter());
println!("NewVec::into_iter: {:?}", new_v.into_iter());
}
此程序正确运行,并生成以下输出:
Vec::into_iter: IntoIter([100])
NewVec::into_iter: IntoIter([(0, 100)])
然而,NewVec::into_iterator调用collect()来创建一个新的Vec,然后调用它的into_iter().
我的目标是消除对collect()的调用,直接返回一个迭代器. 我希望避免不必要的分配.
这个是可能的吗?你会怎么做呢?
请注意,如果我们删除对.Collect()的调用,则会收到以下错误:
error[E0308]: mismatched types
--> src/main.rs:12:9
|
11 | fn into_iter(self) -> Self::IntoIter {
| -------------- expected `std::vec::IntoIter<(usize, u32)>` because of return type
12 | / self.0
13 | | .into_iter()
14 | | .enumerate()
15 | | .into_iter()
| |________________________^ expected `IntoIter<(usize, u32)>`, found `Enumerate<IntoIter<u32>>`
|
= note: expected struct `std::vec::IntoIter<(usize, u32)>`
found struct `Enumerate<std::vec::IntoIter<u32>>`
但我不知道如何将Enumerate
变成std::vec::IntoIter
,或者这是否可能.