我已阅读如何使用索引位置迭代 Vec<T>?答案是enumerate在for-loop 中使用。
但是,如果我不使用这样的for-loop:
fn main() {
let v = vec![1; 10]
.iter()
.map(|&x| x + 1 /* + index */ ) // <--
.collect::<Vec<_>>();
print!("v{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能在上面的闭包中获得索引?
你也可以使用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]
Run Code Online (Sandbox Code Playgroud)
让我们看看这是如何工作的。Iterator::enumerate返回Enumerate<Self>。该类型还实现Iterator:
impl<I> Iterator for Enumerate<I>
where
I: Iterator,
{
type Item = (usize, <I as Iterator>::Item);
// ...
}
Run Code Online (Sandbox Code Playgroud)
如您所见,新迭代器生成索引和原始值的元组。
您可以简单地使用enumerate:
fn main() {
let v = vec![1; 10]
.iter()
.enumerate()
.map(|(i, x)| i + x)
.collect::<Vec<_>>();
print!("v{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)
这样做的原因是因为 for 循环需要一个枚举器:用稍微更抽象的术语来说:
for var in expression {
code
}
Run Code Online (Sandbox Code Playgroud)