附录 E:版本(Editions)
在第 1 章中,你看到 cargo new 会在你的 Cargo.toml 文件中添加一些关于版本(edition)的元数据。本附录将讨论这意味着什么!
Rust 语言和编译器有一个六周的发布周期,这意味着用户可以持续不断地获得新功能。其他编程语言发布较大变更的频率较低;而 Rust 则以更高的频率发布较小的更新。久而久之,所有这些微小的变化累积起来。但从一个版本到另一个版本,很难回顾并说,“哇,在 Rust 1.10 和 Rust 1.31 之间,Rust 已经发生了很大变化!”
大约每三年,Rust 团队会推出一个新的 Rust 版本(edition)。每个版本将已经落地的功能整合成一个清晰的包,并附带完全更新的文档和工具。新版本作为常规六周发布流程的一部分发布。
版本(Editions)对不同的人有不同的用途:
- 对于活跃的 Rust 用户而言,新版本将增量式变更整合成一个易于理解的包。
- 对于非用户而言,新版本标志着一些重大进展已经落地,这可能让 Rust 值得再看一看。
- 对于 Rust 开发者而言,新版本为整个项目提供了一个凝聚点。
在撰写本文时,有四个 Rust 版本(editions)可用:Rust 2015、Rust 2018、Rust 2021 和 Rust 2024。本书使用 Rust 2024 版本(edition)的习惯用法编写。
Cargo.toml 中的 edition 键指示编译器应为你的代码使用哪个版本。如果该键不存在,为了向后兼容,Rust 将使用 2015 作为版本值。
每个项目可以选择使用默认的 2015 版本以外的版本。版本(Editions)可能包含不兼容的变更,例如引入与代码中标识符冲突的新关键字。但是,除非你选择接受这些变更,否则即使你升级所使用的 Rust 编译器版本,你的代码也仍然可以继续编译。
所有 Rust 编译器版本都支持在该编译器发布之前就已存在的任何版本,并且它们可以将任何受支持版本的 crate 链接在一起。版本变更只影响编译器最初解析代码的方式。因此,如果你使用的是 Rust 2015,而你的某个依赖项使用了 Rust 2018,你的项目仍然可以编译并使用该依赖项。反过来,如果你的项目使用 Rust 2018 而依赖项使用 Rust 2015,也同样可以工作。
需要说明的是:大多数功能在所有版本中都是可用的。使用任何 Rust 版本的开发者都会随着新的稳定版本的发布而不断看到改进。然而,在某些情况下,主要是在添加新关键字时,一些新功能可能只适用于较新的版本。如果你想利用这些功能,就需要切换版本。
更多详情,请参阅 The Rust Edition Guide(《Rust 版本指南》)。这是一本完整的书籍,列举了各版本之间的差异,并解释了如何通过 cargo fix 自动将你的代码升级到新版本。