微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让迭代器链执行 for_each() 并返回计数?

如何解决如何让迭代器链执行 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
}

playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。