什么是 Edition?

在2015年5月,Rust 1.0 发布确立了“不僵化下的稳定性”作为 Rust 的核心原则。自那时起,Rust 承诺遵守一项关键规则:一旦某个功能通过稳定版本发布,贡献者将继续在所有未来版本中支持该功能。

然而,有时有必要对语言进行向后不兼容的更改。一个常见的例子是引入新的关键字。例如,早期版本的 Rust 没有 asyncawait 关键字。

如果 Rust 突然引入了这些新关键字,一些代码就会被破坏:let async = 1; 将无法工作。

Rust 使用 edition 来解决这个问题。当存在向后不兼容的更改时,它们会被推迟到下一个 edition。由于 edition 是可选加入的,现有 crate 不会使用这些更改,除非它们明确迁移到新的 edition。例如,最新版本的 Rust 不会将 async 视为关键字,除非选择了 edition 2018 或更高版本。

每个 crate 在其 Cargo.toml 文件中选择其 edition。使用 Cargo 创建新的 crate 时,它将自动选择最新的稳定版 edition。

Edition 不会分裂生态系统

在创建 edition 时,有一条最重要的规则:一个 edition 中的 crate 必须与使用其他 edition 编译的 crate 无缝互操作。

换句话说,每个 crate 可以独立决定何时迁移到新的 edition。这个决定是“私有”的——它不会影响生态系统中的其他 crate。

对于 Rust 而言,这种必需的兼容性意味着对 edition 中可以包含的更改类型有一些限制。因此,新 Rust edition 中的更改往往是“表面”的。所有 Rust 代码——无论使用哪个 edition——最终都会在编译器内部编译为相同的内部表示。

Edition 迁移既简单又大部分自动化

Rust 的目标是让升级到新 edition 的过程变得简单。当新 edition 发布时,crate 作者可以使用 cargo 中的自动化迁移工具进行迁移。Cargo 将对代码进行少量更改,使其与新版本兼容。

例如,迁移到 Rust 2018 时,任何命名为 async 的标识符现在将使用等效的原始标识符语法r#async

Cargo 的自动化迁移并非完美:仍可能存在需要手动更改的特殊情况。它的目标是避免影响代码正确性或性能的语义更改。

本指南涵盖的内容

除了工具之外,本 Rust Edition 指南还涵盖了每个 edition 的更改。它描述了每个更改并链接到更多详细信息(如果可用)。它还涵盖了 crate 作者应该注意的特殊情况或棘手细节。

Crate 作者将找到

  • Edition 概述
  • 特定 edition 的迁移指南
  • 当自动化工具无法工作时的快速故障排除参考。