2个不稳定版本
0.2.0 | 2021年11月10日 |
---|---|
0.1.0 | 2021年11月6日 |
#1853 in 算法
16KB
176 行
Rust迭代器项:语法探索
这个crate是对不稳定生成器特性的薄封装,允许用户创建新项作为生成器。它遵循Propane crate的一般语义,但我的兴趣是让感兴趣的人分叉它,并为这些项制定自己的语法。
以下语法受支持,需要被iterator_item
宏的调用所包围
区分符:*
fn* foo() yields i32 {
for n in 0i32..10 {
yield n;
}
}
区分符:!
gen fn foo() -> i32 {
for n in 0i32..10 {
yield n;
}
}
因为它是一个宏,所以它不如本地语言特性那样有效,并且错误信息也更差,但已经做出了一些努力使其可用。
Propane的设计决策
因为语义严重依赖于Propane,以下考虑也适用于此crate。
Propane设计用于允许用户编写用于实现迭代器的生成器。因此,它的生成器在某种程度上受到限制。以下是Propane的有意设计限制(即,这些限制不是由于错误,它们不是打算解除的)
- Propane生成器成为一个返回
impl Iterator
的函数;迭代器接口是用户可以与生成器的返回类型一起使用的唯一接口。 - Propane生成器只能返回
()
,不能在产生一个类型后返回另一个有趣类型。?
运算符产生错误并在下一次恢复时返回。 - Propane生成器实现Unpin,并且不能是自引用的(与异步函数不同)。
关于Unpin要求的说明
由于Iterator::next
的签名,在调用next
之间移动迭代器始终是安全的。这使得装箱、自引用迭代器不可靠。我们在设计迭代器API时没有Pin
。
然而,通常,用户可以将无权数据推离迭代器,这是他们无法使用futures的方式。通常,futures最终必须是'static
,因此可以启动,但迭代器通常以不需要它们拥有所有数据的方式被消耗。
因此,可能的情况是,仅限于不包含自引用的生成器对于这个用例来说是足够的。丙烷打算探索这个可能性。
依赖项
~2.5MB
~51K SLoC