#iterator #fold #accumulate

no-std iter_accumulate

一个迭代器适配器,它累积元素并为每次迭代返回当前累积值

1 个稳定版本

1.0.0 2024年4月3日

#1118Rust 模式

MIT/Apache

9KB
65

iter_accumulate

一个用于 Rust 的迭代器适配器,使用提供的闭包从基础迭代器累积元素。

示例

use iter_accumulate::IterAccumulate;

let input = [1, 2, 3, 4, 5];
let mut iter = input.iter().accumulate(1, |acc, i| acc * i);

assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), Some(6));
assert_eq!(iter.next(), Some(24));
assert_eq!(iter.next(), Some(120));
assert_eq!(iter.next(), None);

许可证

根据以下任一许可证授权:

您可以选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,将按上述方式双重许可,不附加任何其他条款或条件。


lib.rs:

此软件包提供 accumulate(),一个迭代器适配器,使用提供的闭包从基础迭代器累积元素。

accumulate() 接受两个参数:一个初始值和一个闭包,该闭包有两个参数:一个 '累加器' 和一个元素。

初始值是闭包第一次调用时累加器的值。在每次调用 next() 时,闭包将使用当前累加器和上游迭代器产生的元素执行。然后,闭包的返回值设置为新的累加器值并返回给调用者。

由于累积值需要同时作为累加器存储并返回给调用者,因此累加器类型必须实现 Clone

返回的迭代器不是融合的,也没有指定当基础迭代器返回 None 时会发生什么。如果您想要一个融合的迭代器,请使用 fuse()

fold() 的区别

在原则上,accumulate()fold() 类似。然而,它不是返回最终的累积结果,而是返回一个迭代器,该迭代器为每次迭代提供累积器的当前值。换句话说,accumulate() 生成的最后一个元素,就是如果使用 fold() 将会返回的结果。

示例

use iter_accumulate::IterAccumulate;

let input = [1, 2, 3, 4, 5];
let mut iter = input.iter().accumulate(1, |acc, i| acc * i);

assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), Some(6));
assert_eq!(iter.next(), Some(24));
assert_eq!(iter.next(), Some(120));
assert_eq!(iter.next(), None);

无运行时依赖