#traits #consuming #producing #lazily #sequences #synchronous #bulk

nightly pandapile

用于懒加载生成和消耗序列的特质

2 个不稳定版本

0.2.0 2021年10月11日
0.1.0 2021年10月8日

Rust 模式 中排名 #2428

CC-PDDC 许可证

64KB
365 代码行

熊猫堆

同步和异步 Rust 特质,用于懒加载生成和消耗序列,避免了标准库中特质的一些设计问题。更多详情请参阅 文档


lib.rs:

熊猫堆

用于懒加载或消耗任意长度序列的特质。此软件包提供了对 core::iter::Iteratorstd::io::Readstd::io::Write 特质的统一、同步和异步替代方案,提供了以下改进

  • 生成和消耗 API 之间的二元性
  • 完全类似的同步和异步 API
  • 将批量生成/消耗作为单个生成/消耗子特质
  • 泛型项和错误类型
  • 为最后一个序列项分配专用类型
  • no_std

从第一原理推导 API 的方法在 此处 提供,本文档的其余部分侧重于 是什么如何做,而不是 为什么。此软件包仅提供特质,有关组合器或其他序列抽象的适配器等有用实现,请参阅 panda_party 软件包。

所有特质都有三个版本:同步版本在 sync 模块中;非阻塞版本在 nb 模块中;以及非阻塞、线程安全,适用于在多线程执行器上调度,在 nb_send 模块中。

非阻塞特质

非阻塞API不使用异步函数,一方面是因为截至编写时,Rust不支持在特性行为中使用async fn,另一方面是因为截至编写时,无法获取由async fn返回的Future的类型,这严重阻碍了大多数非平凡库代码。相反,每个特性行为都有一个关联的类型,这个类型是一个执行操作的Future。实际的特性行为方法接受对Self的固定、可变引用,并返回一个对应于Future的固定、可变引用。一个抽象的例子

trait ExampleSynchronousTrait {
    fn method(&mut self, foo: String) -> u32;
}

trait CorrespondingAsynchronousTrait {
    type Method: Future<Output = u32>;
    fn method(self: Pin<&mut Self>, foo: String) -> Pin<&mut Self::Method>;
}

本软件包中所有非阻塞特性行为都是通过这种方式从相应的同步特性行为派生而来的。线程安全的非阻塞特性行为在其关联类型上还有一个+ Send约束。

由于借用规则,这种异步特性行为的方法确保一次最多只能存在一个关联的异步。因此,无法并发地轮询多个关联的异步。因此,非阻塞特性行为的API合约几乎可以与相应同步特性行为的合约保持一致。从非阻塞特性行为中获得的行为,在相应的同步特性行为中是不可能的,唯一的方法是开始轮询一个关联的异步,但在它完成之前放弃它。因为特性行为实现不应该被迫处理这种情况,所以所有非阻塞特性行为的API合约的一部分是,在放弃任何尚未轮询完成的关联异步之后,不得调用任何特性行为方法。

依赖项

~19KB