附录 E:Editions(Rust 的版本机制)¶
这份附录是什么:
Cargo.toml里那个edition = "2024"键的完整解释—— Rust 是怎么做到"语言一直在进化、旧代码却永远编译得过"的。 这是理解 Rust 生态"为什么敢频繁发版"的钥匙,全文只有一页,但概念密度高。
1. 问题:快的发布节奏 vs 稳定的承诺¶
Rust 编译器每六周发一个版本——小步快跑,新特性源源不断。麻烦在于:三四十个六周累积下来,"从 1.10 到 1.31 变化巨大"却始终没有一个宣告升级的节点。edition 就是这个节点:大约每三年,Rust 团队把这些年落地的特性打包成一个命名的语言版本,配上全新文档和工具链支持1。
写作本书时有四个 edition:2015、2018、2021、2024;本书全部示例按 2024 的惯写2。
2. 核心机制:edition 是解析模式,不是编译器版本¶
三条规则,一条比一条重要:
- edition 只影响编译器最初怎么解析你的代码。 它写在 Cargo.toml 里,告诉编译器"这个 crate 按哪一版语言的语法和规则来读"。
- 任何新编译器都支持它发布之前的所有 edition。 装最新的 rustc,2015 版的项目照样编。
- 不同 edition 的 crate 可以互相依赖、互相链接。 你的项目用 2018、依赖用 2021,完全合法——edition 的边界止于单个 crate 的解析,不产生 ABI 或链接层面的分裂3。
由此得出一个操作上的结论:"升级 rustc"和"升级 edition"是两笔独立的账。前者是无感的(旧 edition 的语义被永久冻结);后者是显式选择(改 Cargo.toml 里的键,可能引入不兼容变化——比如新关键字撞了你的标识符,附录 A 的 raw identifier 就是为此备的)。只要你不改 edition 键,代码升级编译器版本永远安全——这是 Rust 向后兼容保证的精确表述4。
3. edition 给谁用¶
附录里列了三类受众:对现役用户,edition 把零碎变化收拢成一个容易理解的包;对观望者,新 edition 是"值得再回头看一眼 Rust"的信号;对语言开发者,edition 是整个项目的集结点5。
4. 我们的判断¶
判断(我们的,不是书里的): edition 机制解决的是"语言演进"和"生态稳定"的结构性矛盾: 别的语言要么冻结语法(Python 2→3 的割裂教训),要么让所有人都被旧决策拖累。 Rust 的解法是把"何时跟上进化"的选择权下放给每个 crate—— 编译器统一向前,解析模式各自定格。代价是生态里长期并存多套惯用法 (2015 的 dyn 缺失、2021 的闭包捕获改进……),读老代码要心里装着"这是哪一版"。 如果错,会错在: "新编译器永远支持旧 edition"是语言团队的承诺而非物理定律—— 极远期(比如 2050 年的编译器)是否仍带 2015 解析模式,取决于维护成本; 但就本书写作时的官方政策而言,承诺是明确的:一直支持。
5. 可带走的¶
- 编译器六周一版;edition 约三年一包(2015/2018/2021/2024)。
edition键决定解析模式,与编译器版本无关。- 新编译器支持所有旧 edition;不同 edition 的 crate 可互链。
- 升级 rustc 永远安全;升级 edition 才需要签字——两件事分开做。
6. 原文地图¶
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 六周节奏与打包动机 | Appendix E: Editions | text/33-apx-e-appendix-e-editions.txt:8(搜「six-week release cycle」) |
| 四个 edition 与 2024 本书口径 | 同上 | text/33-apx-e-appendix-e-editions.txt:24(搜「four Rust editions」) |
| 互操作与解析范围 | 同上 | text/33-apx-e-appendix-e-editions.txt:35(搜「support any edition」) |
| 不升级就兼容的保证 | 同上 | text/33-apx-e-appendix-e-editions.txt:33(搜「continue to compile」) |
-
出处:「Appendix E: Editions」第 8 段(
text/33-apx-e-appendix-e-editions.txt:8,搜「six-week release cycle」)。 ↩ -
出处:「Appendix E: Editions」第 24 段(
text/33-apx-e-appendix-e-editions.txt:24,搜「four Rust editions」)。 ↩ -
出处:「Appendix E: Editions」第 35 段(
text/33-apx-e-appendix-e-editions.txt:35,搜「support any edition」)。 ↩ -
出处:「Appendix E: Editions」第 33 段(
text/33-apx-e-appendix-e-editions.txt:33,搜「continue to compile」)。 ↩ -
出处:「Appendix E: Editions」第 17 段(
text/33-apx-e-appendix-e-editions.txt:17,搜「different purposes」)。 ↩