什么是版本?
在 2015 年 5 月,Rust 1.0 的发布确立了“稳定而不停滞”作为 Rust 的核心原则。自那时起,Rust 承诺遵守一个关键规则:一旦一个特性通过稳定版发布,贡献者将继续支持该特性,使其适用于所有未来的版本。
然而,有时对语言进行向后不兼容的更改是有用的。一个常见的例子是引入新的关键字。例如,早期版本的 Rust 没有 async
和 await
关键字。
如果 Rust 突然引入这些新的关键字,一些代码将会崩溃:let async = 1;
将不再起作用。
Rust 使用版本(editions)来解决这个问题。当存在向后不兼容的更改时,它们会被推送到下一个版本中。由于版本是可选的,除非现有的 crate 明确迁移到新版本,否则它们不会使用这些更改。例如,除非选择 2018 或更高版本,否则最新版本的 Rust 不会将 async
视为关键字。
每个 crate 在其 Cargo.toml
文件中选择其版本。当使用 Cargo 创建一个新的 crate 时,它会自动选择最新的稳定版本。
版本不会分裂生态系统
在创建版本时,有一个最重要的规则:一个版本中的 crate 必须与使用其他版本编译的 crate 无缝互操作。
换句话说,每个 crate 可以独立决定何时迁移到新版本。这个决定是“私有的” - 它不会影响生态系统中的其他 crate。
对于 Rust 来说,这种兼容性要求对可以在版本中出现的更改类型施加一些限制。因此,在新的 Rust 版本中发现的更改往往是“表面上的”。所有 Rust 代码 - 无论版本如何 - 最终都会在编译器内部编译为相同的内部表示形式。
版本迁移容易且高度自动化
Rust 的目标是使升级到新版本成为一个简单的过程。当新版本发布时,crate 作者可以使用 cargo
中的自动迁移工具进行迁移。然后,Cargo 会对代码进行少量更改,以使其与新版本兼容。
例如,当迁移到 Rust 2018 时,任何名为 async
的内容现在都将使用等效的 原始标识符语法:r#async
。
Cargo 的自动迁移并非完美:可能仍然存在需要手动更改的极端情况。它的目标是避免更改可能影响代码正确性或性能的语义。
本指南涵盖的内容
除了工具之外,本 Rust 版本指南还涵盖每个版本中的更改。它描述了每个更改,并链接到其他详细信息(如果可用)。它还涵盖了 crate 作者应该注意的极端情况或棘手细节。
crate 作者应该可以找到
- 版本概述
- 特定版本的迁移指南
- 当自动化工具不起作用时,快速故障排除参考。