如何在 Rust 中 for_each 然后对它们进行计数?

yeg*_*256 2 rust

我试图遍历一个迭代器,选择某些元素,对每个元素执行一些操作,然后计算其中有多少元素受到影响:

let done = foo
  .into_iter()
  .filter(...)
  .for_each(|i| do_something_with(i))
  .len();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为for_each不返回迭代器。到目前为止我发现的最好的选择是:

let mut done = 0;
foo
  .into_iter()
  .filter(...)
  .for_each(|i| { do_something_with(i); done += 1; });
Run Code Online (Sandbox Code Playgroud)

也许有一种更优雅的不可变的?

Pen*_*wen 5

如果您想对每个元素执行某些操作,但不消耗元素的所有权,则Iterator::inspect可以使用该方法。

代码中的另一个问题是Iterator::count应该使用 代替ExactSizeIterator::len.

示例代码:

use core::fmt::Debug;

fn do_something_with(i: impl Debug) {
    println!("{:?}", i);
}

fn main() {
    let foo = [1, 2, 3];
    let done: usize = foo
        .into_iter()
        .filter(|x| x % 2 == 1)
        .inspect(|i| do_something_with(i))
        .count();
    
    println!("{done}");
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您只需要对迭代器生成的项的引用,则可以使用“inspect()”。`for_each()` 给出拥有的项目,如果需要的话,`.map(|x| ...).count()` 就是正确的选择。 (2认同)