1 个稳定版本
1.0.0 | 2024年4月3日 |
---|
#1118 在 Rust 模式
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 License 2.0 (LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
您可以选择。
贡献
除非您明确声明,否则根据 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);