问题描述
我有一个很长的迭代器链,生成的数据插入到一个带有 for_each
的固定数组中。 MWE 版本 (playground):
fn f(xs: impl Iterator<Item = u8>) {
let mut buf = [0u8; 32];
xs.zip(buf.iter_mut()).for_each(|(v,b)| *b = v);
// ... process buf
}
我想计算插入了多少个值。在 mut
中更新的 for_each
变量是一种可能性,但我想看看是否可以避免 mut
。尝试了以下方法:
fn g(xs: impl Iterator<Item = u8>) {
let mut buf = [0u8; 32];
let c = xs.zip(buf.iter_mut()).inspect(|(v,b)| *b = v).count();
// ... process buf
}
但这不起作用,因为我无法修改 b
内的 inspect
。
迭代器链有没有办法进行数组赋值并返回计数?
解决方法
在这种情况下,您可以简单地将 inspect
替换为 map
:
fn g(xs: impl Iterator<Item = u8>) {
let mut buf = [0u8; 32];
let c = xs.zip(buf.iter_mut()).map(|(v,b)| *b = v).count();
// ... process buf
}
此 map()
将产生 ()
的迭代器(因为这是赋值返回的内容),但您只是在计数,因此实际值是什么并不重要。
在 mut
中更新的 for_each
变量是一种可能性,但我想看看是否可以避免 mut
。
那将是我的第一个建议,但如果您想看到另一种方法,您可以将 xs
的限制收紧为 ExactSizeIterator
而不仅仅是 Iterator
这使您能够查询其 len
,然后您可以使用简单的数学计算 count
:
use std::cmp;
fn f(xs: impl ExactSizeIterator<Item = u8>) {
let mut buf = [0u8; 32];
let count = cmp::min(32,xs.len());
xs.zip(buf.iter_mut()).for_each(|(v,b)| *b = v);
// Process buf
}