我有一个迭代器,我想用一个很好的方法(比如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>();这行得通,但是是偶然工作的还是这种行为是有保证的呢?文档中的inspect提到每个元素都会调用闭包,但也指出它主要用作调试工具。我不确定在生产代码中以这种方式使用它是否是个好主意。
发布于 2019-01-13 18:30:28
我想说它是有保证的,但是你永远不会发现它是这样明确地声明的。正如你提到的,文件说明
对迭代器的每个元素执行一些操作,传递值。
由于函数保证为每个元素运行闭包,而语言保证在运行闭包时会发生什么(根据闭包的定义),所以行为是安全的。
尽管如此,一旦您有了一个或多个副作用,也许最好避免沉重的链接,转而使用乏味的for循环来提高可读性,但这将取决于具体情况。
https://stackoverflow.com/questions/54171609
复制相似问题