5 个版本 (破坏性更新)
0.5.0 | 2023年4月22日 |
---|---|
0.4.0 | 2022年12月21日 |
0.3.0 | 2022年5月30日 |
0.2.0 | 2022年5月5日 |
0.1.0 | 2022年4月16日 |
#925 在 Rust 模式
每月29次 下载
42KB
552 行
autofolder
autofolder 提供了一个单元素的 "折叠" 容器,可以用于以临时方式累积/选择等值。
TL;DR: DynFolder
示例
use autofolder::*;
// Create an autofolder that retains the max u32 value:
let mut max = DynFolder::new(0_u32, std::cmp::max);
// We can "fold-in" individual items:
max.fold(3);
// We can then peek at the running output:
println!("Partial max is {}", max.as_ref());
// And still keep on folding by processing whole iterators:
max.extend((1..=5));
// And finally consume the autofolder to get the final output value:
println!("Max value is {}", max.into_inner());
有关有用的特定减少器,请参阅 Min
、Max
和 MinMax
。
理由
折叠 在 Rust 中是通过 Iterator::fold
方法实现的,如下所示
iterator.fold(initial, function);
// (and this is all you can do)
当所有所需数据都由单个迭代器提供时,这效果很好。如果我们有更复杂的逻辑,就不能使用 fold
。
autofolder 通过以初始值和折叠函数构建,并在其生命周期内接受来自不同类型和来源的值,来反转这种结构。
let mut autofolder = Autofolder::new(initial, function);
// Fold in a whole iterator, can be repeated:
autofolder.extend(iterator);
// Fold in an individual value:
autofolder.fold(value);
文件夹类型
通过绑定策略
此软件包提供两种不同功能绑定策略的自动文件夹
DynFolder
:折叠函数作为闭包提供,并保存在结构体字段中。特点- 折叠函数可以使用任何类型,无论是内置的还是其他类型的。
- 每个实例可以使用不同的折叠函数,作为构造函数参数提供。另一方面,我们不能使用
DynFolder
与.collect()
。 - 由于使用动态调度,效率略低于
ImplFolder
- 我们实际上是在使用函数指针而不是函数调用。
ImplFolder
:折叠函数通过特性行实现。- 折叠函数只能使用用户软件包中定义的类型,这是使用特性行为的限制。
- 每个由类型对定义的参数化
ImplFolder
只能有一个折叠函数。因此,如果output
类型实现了Default
,我们就可以使用ImplFolder
与.collect()
结合。 - 由于单态化,比
DynFolder
稍微高效,将.fold
调用转换为直接函数调用。
通过聚合策略
reduce是Rust中的一种特殊折叠,其中聚合函数和折叠函数的项类型相同(Fn(Item, Item) -> Item
)。这允许我们使用第一个产生的值设置内部自动折叠状态,而不调用相应的函数。
此crate提供了以下“自动减少器”类型
DynReduce
:通过特性行实现减少函数。- 类似于
DynFolder
。 .into_inner()
返回一个Option
。- 构造函数接受一个
reduce
函数。
- 类似于
ImplReduce
:通过特性行实现减少函数。- 类似于
ImplFolder
。 .into_inner()
返回一个Option
。- 即使在类型参数没有实现
Default
的情况下,也实现了.collect()
。
- 类似于
特定的自动折叠器
此crate还提供了一些针对特定函数的内置自动折叠器
Min
:仅保留迭代过程中给出的最小值容器,如std::cmp::PartialOrd
所定义。Max
:类似于Max
,但用于最大值。MinMax
:保留包含最小值和最大值的元组容器。