我试图遍历一个迭代器,选择某些元素,对每个元素执行一些操作,然后计算其中有多少元素受到影响:
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)
也许有一种更优雅的不可变的?
如果您想对每个元素执行某些操作,但不消耗元素的所有权,则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)