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日

#925Rust 模式

每月29次 下载

MIT 许可证

42KB
552

CI coveralls crates.io doc.rs

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());

有关有用的特定减少器,请参阅 MinMaxMinMax

理由

折叠 在 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提供了以下“自动减少器”类型

特定的自动折叠器

此crate还提供了一些针对特定函数的内置自动折叠器

  • Min:仅保留迭代过程中给出的最小值容器,如std::cmp::PartialOrd所定义。
  • Max:类似于Max,但用于最大值。
  • MinMax:保留包含最小值和最大值的元组容器。

无运行时依赖