1 个不稳定版本
0.1.0 | 2020 年 8 月 6 日 |
---|
#5 在 #iterators
8KB
propane - Rust 生成器
Propane 是不稳定生成器功能的一个薄包装,允许用户创建自由函数作为生成器。它实现了一种关于生成器应该如何设计的特定想法;生成器至今仍然不稳定的一个很大原因就是这些设计问题尚未解决。
语法看起来像这样
#[propane::generator]
fn foo() -> i32 {
for n in 0i32..10 {
yield n;
}
}
因为它是一个宏,所以它的性能不如原生语言功能,并且错误信息也更差。
设计决策
Propane 被设计为允许用户编写用于实现迭代器的生成器。因此,其生成器在某些重要方面受到限制。这些是 Propane 的故意设计限制(即,这些限制不是由于错误,它们不是有意要取消的)
- 一个 Propane 生成器变成一个返回
impl Iterator
的函数;迭代器接口是用户可以与生成器的返回类型一起使用的唯一接口。 - 一个 Propane 生成器只能返回
()
,它不能先返回一个类型然后再返回另一个有趣的类型。操作符?
返回错误,然后在下一次恢复时返回。 - 一个 Propane 生成器实现了 Unpin,并且不能是自引用的(与异步函数不同)。
关于 Unpin 要求的说明
由于 Iterator::next
的签名,在调用 next
之间移动迭代器始终是安全的。这使得未装箱、自引用的迭代器不安全。我们在设计迭代器 API 时没有 Pin
。
然而,通常情况下,用户可以将未拥有数据推送到迭代器外部,而在未来中则不能这样做。未来通常最终必须是 'static
,这样它们就可以被启动,但迭代器通常是以不需要它们拥有所有数据的方式被消费的。
因此,可能的情况是,仅限于不包含自引用的生成器对于这种用例就足够了。Propane 打算探索这种可能性。
依赖项
~1.5MB
~35K SLoC