2021 年 3 月 4 日,由 Ryan Levick 代表 Rust 2021 版本工作组发布博文:Planning the Rust 2021 Edition。
译注:此为版本
edition
,非version
。如Rust 2018 edition
,对应的version
为Rust 1.31.0
,其最重要的特性是Non-lexical lifetimes(NLL)
。笔者估计,Rust 2021 edition
,会对应 Rust 1.51.0,语法演变不多。主要是关于Cargo
的新特性方面,如resolver
(详细请参阅 Rust 1.51.0 已正式发布,及其新特性详述)。
Rust 2021 版本工作组很高兴地宣布:Rust 的下一代版本,Rust 2021,将定于今年(2021)晚些时候发布。虽然关于 Rust 2021 版本的 RFC 介绍,在形式上仍然是开放的,但我们预计,RFC 将很快会被合并。计划和准备已经开始,我们正在按计划进行!
如果你关注 Rust 2021 版本会引入什么特性,或者了解稳定版发布的时间线,请继续阅读!
Rust 2021 包含什么?
Rust 2021 的最终特性列表,仍在审定中。总的来说,相比 Rust 2018,Rust 2021 特性的发布目标要小得多。有以下几个原因:
- 为版本发布确立一个有规律的节奏。在版本级别,采用 Rust “train(译注:比喻改进的一系列节奏感)” 的发布模型,会有许多好处。
- Rust 2018,需要直接解决 Rust 的“低应力(low stress)”问题(Rust 2018 worked directly against the Rust model of “low stress” releases)。
- Rust 语言演变方面,突破性变化较少。
您可以在 RFC 中,阅读到更多关于版本演变的信息。
特性是否会包含在 Rust 2021 中,是 RFC 审定过程的一部分。因此,从当前到发布的这段时间内,特性列表仍然可能会改变。也就是说,以下特性,可能会包含在 Rust 2021 版本中:
prelude 的变更
尽管类型和自由函数(译注:非成员函数),可以不受版本约束而添加到 prelude
中。但对于 trait 来说,情况并非如此。向 prelude
添加 trait 可能会导致兼容性问题:新进入作用域的 trait,其包含的方法可能会有重名,从而导致对方法的调用会变得模棱两可。
目前,建议将以下 trait 纳入到 Rust 2021 版本:
TryFrom
/TryInto
FromIterator
此变更的 RFC 可通过此链接查阅。请注意,RFC 尚未合并,prelude
的新内容仍在积极讨论中。
新的闭包捕获规则
RFC 2229 建议:在可能的情况下,闭包捕获单个字段,而非整个结构体。此 RFC 已被接受。在某些情况下,此变更将导致析构函数与当前版本的运行不同。因此,必须将此变更关联到新版本。后续,将会提供代码迁移的 lint 工具,以避免更改现有代码的语义。
Cargo 新特性 resolver
在 Rust 1.51 中,Cargo 将有一个稳定的新特性 resolver
(详细请参阅 Rust 1.51.0 已正式发布,及其新特性详述),resolver
允许 crate 的依赖项在不同的上下文中使用不同的特性。例如,#[no_std]
crate 可能希望:将特定的依赖项用作构建(build)依赖项,启用 std
;而常规依赖项,则禁用 std
。目前,因为特性属于全局命名空间,所以会导致在这两种情况下都将启用 std
。
在 Rust 2021 版本中,这个新的 resolver
将成为默认的。但是 Rust 2018 版本中,仍然可以对新的 resolver
选择使用。
代码语言:javascript复制译注:Rust 2018 版本中,可以通过在
Cargo.toml
中加入一行设定,来启用Cargo 新特性resolver。
笔者项目中已经尝鲜
:
[package]
resolver = "2"
# 或者,你使用 workspace
[workspace]
resolver = "2"
其它
其它提议的变更包括:统一 std
和 core
中的 panic
,以及将一些 lint
从警告升级为错误。
正在考虑中的完整特性列表,请参阅此链接。
如果您关注于一个特性,其已经在讨论,并被包含在 Rust 的下一个版本中,但却没有在完整特性列表中
列出,请告知我们。虽然,我们很高兴听到更多还没有被讨论的功能,但可能直到 Rust 2021 版本准备发布,我们也不太可能有精力来讨论所有功能。
时间线粗估
以下是目标里程碑的时间表:
- 4 月 1 日:所有相关 RFC 合并,或处于良好状态(即,所有达成的重大决策和合并,将在接下来的几周内进行)。
- 5 月 1 日:Rust 2021 中包含的所有特性,将包含在
nightly
版本中。 - 6 月 1 日:所有
lints
将包含在nightly
版本中。 - 9 月 1 日:Rust 2021 在
nightly
版本中稳定。 - 10 月 21 日:Rust 2021 版本稳定。
当接近最后期限时,我们将缩小那些已经取得积极进展的项目,并拟议变更清单。
参与邀请
如果您有兴趣对 Rust 2021 版本的发布提供帮助,请联系我们。除了特性转向工作和版本管理规划之外,还有很多工作要做。版本发布需要执行的一些附加工作项包括:
- 所有相关特性的
rustfix
迁移 - 测试所有特性及其迁移路径
- 博客文章和其它宣传材料
谢谢您的阅读!