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

Tom*_*Tom 5 rust

我已阅读如何使用索引位置迭代 Vec<T>?答案是enumeratefor-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)

我怎样才能在上面的闭包中获得索引?

Luk*_*odt 8

你也可以使用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)

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


Tom*_*Tom 5

您可以简单地使用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)

该表达式是一个迭代器。

  • 提示:如果您打算自行回答问题,请在[“提问”形式](/sf/) 中,底部有一个“回答您自己的问题”复选框。这样,您的答案就会在您发布问题的同时出现。 (3认同)
  • 谢谢卢卡斯。发帖后5秒我才意识到 (3认同)