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