如何解决如何让迭代器链执行 for_each() 并返回计数?
我有一个很长的迭代器链,生成的数据插入到一个带有 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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。