
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 2018,Rust 2021 特性的发布目标要小得多。有以下几个原因:
您可以在 RFC 中,阅读到更多关于版本演变的信息。
特性是否会包含在 Rust 2021 中,是 RFC 审定过程的一部分。因此,从当前到发布的这段时间内,特性列表仍然可能会改变。也就是说,以下特性,可能会包含在 Rust 2021 版本中:
尽管类型和自由函数(译注:非成员函数),可以不受版本约束而添加到 prelude 中。但对于 trait 来说,情况并非如此。向 prelude 添加 trait 可能会导致兼容性问题:新进入作用域的 trait,其包含的方法可能会有重名,从而导致对方法的调用会变得模棱两可。
目前,建议将以下 trait 纳入到 Rust 2021 版本:
TryFrom/TryIntoFromIterator此变更的 RFC 可通过此链接查阅。请注意,RFC 尚未合并,prelude 的新内容仍在积极讨论中。
RFC 2229 建议:在可能的情况下,闭包捕获单个字段,而非整个结构体。此 RFC 已被接受。在某些情况下,此变更将导致析构函数与当前版本的运行不同。因此,必须将此变更关联到新版本。后续,将会提供代码迁移的 lint 工具,以避免更改现有代码的语义。
在 Rust 1.51 中,Cargo 将有一个稳定的新特性 resolver(详细请参阅 Rust 1.51.0 已正式发布,及其新特性详述),resolver 允许 crate 的依赖项在不同的上下文中使用不同的特性。例如,#[no_std] crate 可能希望:将特定的依赖项用作构建(build)依赖项,启用 std;而常规依赖项,则禁用 std。目前,因为特性属于全局命名空间,所以会导致在这两种情况下都将启用 std。
在 Rust 2021 版本中,这个新的 resolver 将成为默认的。但是 Rust 2018 版本中,仍然可以对新的 resolver 选择使用。
译注:Rust 2018 版本中,可以通过在
Cargo.toml中加入一行设定,来启用Cargo 新特性resolver。笔者项目中已经尝鲜:
[package]
resolver = "2"
# 或者,你使用 workspace
[workspace]
resolver = "2"其它提议的变更包括:统一 std 和 core 中的 panic,以及将一些 lint 从警告升级为错误。
正在考虑中的完整特性列表,请参阅此链接。
如果您关注于一个特性,其已经在讨论,并被包含在 Rust 的下一个版本中,但却没有在完整特性列表中列出,请告知我们。虽然,我们很高兴听到更多还没有被讨论的功能,但可能直到 Rust 2021 版本准备发布,我们也不太可能有精力来讨论所有功能。
以下是目标里程碑的时间表:
nightly 版本中。lints 将包含在 nightly 版本中。nightly 版本中稳定。当接近最后期限时,我们将缩小那些已经取得积极进展的项目,并拟议变更清单。
如果您有兴趣对 Rust 2021 版本的发布提供帮助,请联系我们。除了特性转向工作和版本管理规划之外,还有很多工作要做。版本发布需要执行的一些附加工作项包括:
rustfix 迁移谢谢您的阅读!