1 个不稳定版本
0.1.0 | 2020 年 8 月 6 日 |
---|
#1067 in #generator
在 propane 中使用
8KB
136 行
propane - Rust 生成器
Propane 是对不稳定生成器功能的薄包装,允许用户创建作为生成器的自由函数。它实现了一种特定的生成器设计理念;生成器至今仍不稳定的一个大原因是这些设计问题尚未确定。
语法如下
#[propane::generator]
fn foo() -> i32 {
for n in 0i32..10 {
yield n;
}
}
由于它是一个宏,所以它不如原生的语言功能表现得那么好,并且错误信息更差。
设计决策
Propane 设计用于允许用户编写迭代器实现的生成器。因此,其生成器在某种程度上受到限制。这些都是 propane 的有意设计限制(即,这些不是由于错误而导致的限制,它们不是有意要取消的)
- A propane 生成器成为一个返回
impl Iterator
的函数;迭代器接口是用户可以与生成器返回类型一起使用的唯一接口。 - A propane 生成器只能返回
()
,它不能先返回一个类型,然后返回另一个有趣类型。The?
操作符返回错误,然后在下一次恢复时返回。 - A propane 生成器实现了 Unpin,并且不能是自引用的(与异步函数不同)。
关于 Unpin 要求的说明
由于 Iterator::next
的签名,在调用 next
之间移动迭代器总是安全的。这使得未装箱、自引用的迭代器不安全。在我们设计迭代器 API 的时候,我们没有 Pin
。
然而,一般来说,用户可以以他们无法与 futures 一样的方式将未拥有的数据推到迭代器之外。通常,futures 最终必须 'static
,因此可以启动,但迭代器通常以不需要拥有所有数据的方式被消耗。
因此,可能的情况是,限制生成器不包含自引用的生成器对于这种用途来说是足够的。Propane 意图探索这种可能性。
依赖关系
~1.5MB
~35K SLoC