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

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。