如何在没有for循环的情况下获取迭代中正在处理的当前元素的索引?



我已经阅读了如何使用索引位置迭代 Vec? 答案是在for循环中使用enumerate

但是如果我不使用这样的for循环:

fn main() {
let v = vec![1; 10]
.iter()
.map(|&x| x + 1  /* + index */ ) // <--
.collect::<Vec<_>>();
print!("v{:?}", v);
}

如何在上述闭包中获取索引?

你也可以使用enumerate

let v = vec![1; 10]
.iter()
.enumerate()
.map(|(i, &x)| x + i)
.collect::<Vec<_>>();
println!("v{:?}", v);   // prints v[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

让我们看看这是如何工作的。Iterator::enumerate返回Enumerate<Self>.该类型还实现了Iterator

impl<I> Iterator for Enumerate<I>
where
I: Iterator,
{
type Item = (usize, <I as Iterator>::Item);
// ...
}

如您所见,新的迭代器生成索引和原始元组 价值。

您可以简单地使用enumerate

fn main() {
let v = vec![1; 10]
.iter()
.enumerate()
.map(|(i, x)| i + x)
.collect::<Vec<_>>();
print!("v{:?}", v);
}

这样做的原因是 for 循环采用枚举器: 用稍微抽象一点的术语来说:

for var in expression {
code
}

表达式是一个迭代器。

最新更新