生成器已死,协程万岁,生成器回来了

2023 年 10 月 23 日 · oli-obk

我们已将不稳定的 Generator trait 重命名为 Coroutine,并相应调整了所有术语。如果你想查看所有 3800 行修改的代码,可以在 这里找到 PR。

我们的 Generator trait 实际上已经是协程了,所以这次更改早该进行了。所有使用 Generator trait 的 nightly 用户现在必须更新代码以引用新的 feature gate 和 trait 名称。

有什么区别?

生成器只是一种编写 Iterator 实现的便捷方式。这意味着它是一个没有参数和返回类型的协程。相反,当它返回时,意味着迭代结束,Iterator::next 方法返回 None

回到原点

这次更改的直接动机是重新引入生成器,这次使用更简单的(async/await 风格的)语法来创建 Iterator。关于此的一些讨论可以在 gen fn rfc 中找到。

当然,如此大规模的更改如果不立即通过一个 PR 重新引入一个刚被移除名称的新概念,那将是不完整的,所以你可以在 这里看到 gen 块的 MVP,它的诊断信息非常奇怪,如果你过度试探它,它可能会 panic。