我已经阅读了如何使用索引位置迭代 Vecfor
循环中使用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
}
表达式是一个迭代器。