gpt4 book ai didi

rust - `Iterator::inspect` 中闭包的副作用是否定义明确,因此它可以用于例如数数?

转载 作者:行者123 更新时间:2023-11-29 07:59:21 25 4
gpt4 key购买 nike

我有一个迭代器,我想用一个很好的方法折叠它(比如 Iterator::sum):

let it = ...;
let sum = it.sum::<u64>();

然后我注意到我还需要知道迭代器中元素的数量。我可以编写一个 for 循环并手动进行计数和求和,但这并不好,因为我必须更改一个可能很长的迭代器适配器链以及所有这些。此外,在我的真实代码中,我没有使用 sum,而是使用了一种更复杂的“折叠方法”,我不想复制这种逻辑。

我想到了(滥用)使用 Iterator::inspect :

let it = ...;
let mut count = 0;
let sum = it.inspect(|_| count += 1).sum::<u64>();

This works ,但是它是巧合还是保证这种行为? inspect 的文档提到为每个元素调用闭包,但也指出它主要用作调试工具。我不确定在生产代码中以这种方式使用它是否是个好主意。

最佳答案

我会说这是有保证的,但您永远不会发现它是这样明确说明的。正如你提到的,the documentation states :

Do something with each element of an iterator, passing the value on.

由于函数保证为每个元素运行闭包,并且语言保证运行闭包时会发生什么(根据闭包的定义),因此可以安全地依赖该行为。

话虽这么说,一旦您有一个或多个副作用,最好避开繁重的链接并转向无聊的 for 循环以提高可读性,但这将取决于具体情况.

关于rust - `Iterator::inspect` 中闭包的副作用是否定义明确,因此它可以用于例如数数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54171609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com