规划 Rust 2021 版本

2021 年 3 月 4 日 · Ryan Levick 代表 Rust 2021 版本工作组

Rust 2021 版本工作组很高兴地宣布,下一个 Rust 版本,即 Rust 2021,计划于今年晚些时候发布。虽然正式引入此版本的 RFC 仍在开放中,但我们预计它将很快合并。规划和准备工作已经开始,我们正按计划进行!

如果您想了解 Rust 2021 将引入哪些特性或该版本何时能在 stable 上发布的时间表,请继续阅读!

此版本包含哪些内容?

Rust 2021 中包含的最终特性列表仍在决定中。总体而言,我们的目标是让 Rust 2021 成为一个比 Rust 2018 小得多的版本。这主要有以下几个原因:

  • 建立一个定期的版本发布节奏意味着我们可以在版本级别获得 Rust “火车”发布模型的许多好处。
  • Rust 2018 与 Rust 的“低压力”发布模型直接冲突。
  • 只需更少的破坏性更改就能继续发展语言。

您可以在 RFC 中阅读更多关于版本概念演变的内容。

是否将某个特性包含在 Rust 2021 中是 RFC 流程的一部分,因此可能的特性短列表从现在到版本发布期间可能会并且将会发生变化。话虽如此,以下是一些可能包含在此版本中的特性:

Prelude 变更

虽然类型和自由函数可以独立于版本边界添加到 prelude 中,但 trait 则不然。向 prelude 添加 trait 可能会导致兼容性问题,因为与新引入的 trait 方法同名的方法调用会变得模糊不清。

目前正在提议将以下 trait 包含在 Rust 2021 版本中:

  • TryFrom/TryInto
  • FromIterator

此变更的 RFC 可在此处找到。请注意,该 RFC 尚未合并,新的 prelude 内容仍在积极讨论中。

新的闭包捕获规则

RFC 2229 提议闭包在可能的情况下捕获单个字段而不是整个结构体。该 RFC 已被接受。在某些情况下,此变更会导致析构函数的运行时间与当前不同,因此必须将其与版本绑定。将提供迁移 lint 以避免更改现有代码的语义。

Cargo 中的新默认特性解析器

在 Rust 1.51 中,Cargo 将稳定一个新的特性解析器,它允许 crate 的依赖项在不同上下文中使用不同的特性。例如,一个 #[no_std] crate 可能希望将特定的依赖项既作为构建依赖项使用(启用 std),又作为常规依赖项使用(禁用 std)。目前,这会导致在两种情况下都启用 std,因为特性属于全局命名空间。

在 Rust 2021 中,这个新的解析器将成为默认设置,但旧版本仍然可以通过选择启用它来使用新的解析器。

其他

其他提议的变更包括统一 stdcorepanic 的工作方式,以及将一些 lint 从警告升级为错误

您可以在此处找到正在考虑的特性完整列表。

如果您知道某个特性已在讨论中,并考虑包含在下一个 Rust 版本中,但未在此处列出,请告知我们。虽然我们很高兴听到尚未讨论包含在 Rust 版本中的其他特性,但在 Rust 2021 版本准备发布之前,我们不太可能有精力讨论此类特性。

大致时间表

那么我们计划如何发布新版本呢?以下是我们旨在实现的时间表里程碑:

  • 4 月 1 日:所有相关 RFC 都已合并或处于良好状态(即,所有主要决定都已达成,并将在接下来几周内合并)。
  • 5 月 1 日:所有包含在 Rust 2021 中的特性都在 nightly 版本中,并受 feature flags 控制。
  • 6 月 1 日:所有 lint 都在 nightly 版本中实现。
  • 9 月 1 日:该版本在 nightly 版本中稳定。
  • 10 月 21 日:该版本发布到 stable。

随着我们接近这些截止日期,我们将缩小提议变更的范围,仅包含那些已取得积极进展的项目。

呼吁参与

如果您有兴趣帮助发布 2021 版本,请联系我们。除了特性工作和版本管理规划,还有很多工作需要做。版本发布所需的一些额外工作项包括:

  • 针对所有相关特性的 rustfix 迁移
  • 测试所有特性及其迁移路径
  • 博客文章和其他宣传材料