- 教程
- 文档
【免费下载链接】book
The Rust Programming Language
前言导读:这篇指南围绕 The Rust Programming Language(即《The Rust Programming Language》书籍,本仓库为 rust-lang/book 的开源镜像)的 Preface 展开,系统讲解本书在 Rust 2021 Edition 与 Rust 1.62.0 基线之上的撰写前提、2021 版语言改进对全书内容的具体影响、以及本书相较前版的重要修订点。读完本文,你将掌握如何识别项目中的 Edition 配置、理解 Rust 向后兼容保证的实际含义,并知道本书各章节(尤其第 7 章模块组织与第 13 章闭包)在内容上的关键升级在哪里。
一、前言说了什么:一份写给读者的“版本基线声明”
nostarch/preface.md是本书的 Preface,篇幅虽短,信息密度却很高。它首先给出了一条硬性前提:
本书文本假定你使用的 Rust 版本为1.62.0(发布于 2022-06-30)或更高,并且所有项目都在
Cargo.toml中设置edition = "2021",以便使用 Rust 2021 Edition 的惯用写法。
这句话在仓库里可以被多处印证:
- 书籍正文的安装章节 src/ch01-01-installation.md 明确说明本书示例在“任何更新的稳定版本”上都应能正常编译,因为 Rust 的稳定性保证保证了“书中能编译的示例在更新的 Rust 版本下依然能编译”。
- 仓库根目录的 rust-toolchain 文件将工具链固定为
1.97,说明当前代码库已经用远高于 1.62.0 的版本验证过。 - 全书所有示例清单(listings)的
Cargo.toml均已使用更新的 Edition 配置,例如 listings/ch02-guessing-game-tutorial/listing-02-01/Cargo.toml 中即为edition = "2024"。这说明仓库已随版本演进持续同步升级,而 Preface 所描述的是该书面向读者时的撰写基线。
前言还指向了书中两处延伸阅读:“Installation”(安装说明)与Appendix E(Edition 说明)。在本书中分别对应:
- 安装/更新 Rust:src/ch01-01-installation.md
- Edition 详解:src/appendix-05-editions.md
二、Rust 2021 Edition 是什么:语言层面的改进与一致性修正
Preface 指出,2021 Edition 包含了一系列让 Rust 更符合人体工程学(ergonomic)的改进,并修正了一些不一致之处。要真正理解这句话,需要结合 Appendix E 的内容:
Rust 编译器采用约六周的发布周期,功能以小步快跑的方式持续累积;而“Edition”(版本代)每三年左右推出一次,把这些增量变化打包成一个清晰的整体,并配以完整更新的文档与工具链。截至本书写作时,已有四个 Edition 可用:Rust 2015、Rust 2018、Rust 2021 与 Rust 2024;Preface 面向的是 Rust 2021。
edition键在Cargo.toml中指示编译器以哪种 Edition 语义解析你的代码:
[package] name = "my_project" version = "0.1.0" edition = "2021"关键事实(均来自 src/appendix-05-editions.md):
- 若
edition键缺失,Rust 出于向后兼容考虑默认使用2015。 - Edition 可以包含不兼容的变化(例如引入新关键字可能与已有标识符冲突),但除非你显式选择新的 Edition,否则即使升级编译器版本,代码也继续编译。
- 所有编译器版本都支持其发布之前存在的任何 Edition,并且可以混合链接不同 Edition 的 crate:你的项目用 2018、依赖用 2015(或反之)都能编译。
- Edition 的变化只影响编译器最初解析代码的方式;绝大多数特性在所有 Edition 上可用,只有少数(主要是新增关键字类)特性仅在较新 Edition 可用。
Preface 特别强调:“任何来自本书早期版本的、曾经能编译的代码,只要项目Cargo.toml中声明了对应的 Edition,即使你升级了 Rust 编译器版本,也依然能编译”——这正是 Rust 向后兼容保证的体现。
三、本书相较前版的改进清单
Preface 列出了这版书针对读者反馈所做的具体改进,共三条,逐一展开如下。
3.1 第 7 章:新增“模块快速参考”
第 7 章新增了一个**模块快速参考(quick reference)**小节,讲解如何用模块把代码组织到多个文件中。正文对应 src/ch07-02-defining-modules-to-control-scope-and-privacy.md 开头的 “Modules Cheat Sheet”,核心规则包括:
- 从 crate 根开始:编译 crate 时,编译器首先在 crate 根文件(库 crate 通常是
src/lib.rs,二进制 crate 通常是src/main.rs)中查找代码。 - 声明模块:在 crate 根用
mod garden;声明模块后,编译器按顺序在以下位置查找模块代码:- 内联:紧随
mod garden的花括号内; - 文件
src/garden.rs; - 文件
src/garden/mod.rs。
- 内联:紧随
- 声明子模块:在非 crate 根文件里可声明子模块,如
mod vegetables;,编译器会按父模块目录名查找src/garden/vegetables.rs或src/garden/vegetables/mod.rs。 - 路径:模块一旦成为 crate 的一部分,只要隐私规则允许,就能通过路径从 crate 内任意位置引用,如
crate::garden::vegetables::Asparagus。 - 私有与公有:模块内的代码默认对其父模块私有;用
pub mod公开模块,用pub公开模块内的条目。 use关键字:在作用域内用use crate::garden::vegetables::Asparagus;创建快捷方式,之后只需写Asparagus即可。
仓库中的完整可运行示例位于 listings/ch07-managing-growing-projects/quick-reference-example,其中包含src/main.rs、src/garden.rs与src/garden/vegetables.rs,与正文逐行对应,可直接作为模块组织的实战模板。
3.2 第 13 章:新的闭包示例
第 13 章引入了更新、更清晰的闭包示例,重点阐明三件事:捕获(captures)、move关键字与Fn系列 trait。正文位于 src/ch13-01-closures.md,其要点如下:
闭包可以捕获环境:与函数不同,闭包能捕获定义它的作用域中的值。书中用“T 恤公司促销”例子演示:giveaway方法对Option<ShirtColor>调用unwrap_or_else,传入闭包|| self.most_stocked()。该闭包捕获了对self的不可变引用,并在None时才被求值。注意:标准库无需知道Inventory或ShirtColor的任何细节——这正是闭包捕获环境的价值。
闭包自动实现一个或多个Fntrait(按“加法”方式叠加),取决于闭包体如何处理捕获值:
FnOnce:只能调用一次的闭包。所有闭包至少实现该 trait;若闭包把捕获值移出闭包体,则只实现FnOnce。FnMut:不移出捕获值、但可能修改捕获值的闭包,可多次调用。Fn:既不移出也不修改捕获值的闭包,以及什么都不捕获的闭包,可多次调用且不修改环境。
以Option<T>的unwrap_or_else为例(正文中的标准库签名):
impl<T> Option<T> { pub fn unwrap_or_else<F>(self, f: F) -> T where F: FnOnce() -> T { match self { Some(x) => x, None => f(), } } }其 trait bound 用FnOnce,因为f至多被调用一次,从而能接受全部三种闭包,灵活性最大化。而切片上的sort_by_key用FnMut,因为它会对每个元素调用一次闭包。书中 Listing 13-8 展示了一个只实现FnOnce的闭包(把value移入sort_operations向量)无法用于sort_by_key,编译器会报错——这个对照示例把 trait 选择背后的“调用次数”逻辑讲得非常透彻。
move关键字:当闭包需要把捕获值“移入”闭包(而非借用)时使用move。Preface 明确把“更清晰地阐明move关键字”列为本章改进点之一。
注意:本书当前源码版本中第 13 章正文已随 Edition 升级同步演进,Preface 所述为该章节在 Rust 2021 基线下的改进版本;无论哪个 Edition,闭包捕获、move与Fntrait 的语义都保持一致,示例本身在各 Edition 下均可编译运行。
3.3 全文勘误与措辞修正
Preface 最后提到:本书修正了全文若干小错误和不精确的措辞,并感谢了反馈这些问题的读者。这是文档维护层面的常规修订,无技术性内容,但体现了本书与社区反馈保持同步的维护方式。
四、对读者的实操建议
结合 Preface 与 src/appendix-05-editions.md,可以给出以下可落地的检查清单:
- 确认 Rust 工具链版本:运行
rustc --version,确保不低于 1.62.0(当前仓库 rust-toolchain 已固定为 1.97,可作为参考基线)。更低的版本可能无法完整体现书中示例行为。 - 确认项目 Edition:检查项目
Cargo.toml中的edition字段。若想完整跟随本书 Rust 2021 的写法,设置为edition = "2021";若希望与当前仓库最新清单一致,可参考 listings/ch02-guessing-game-tutorial/listing-02-01/Cargo.toml 等文件使用更新的 Edition 值。 - 利用向后兼容保证:旧项目只要声明了对应 Edition,升级 Rust 编译器版本后依然能编译;混合不同 Edition 的依赖也完全可行。这一保证正是 Preface 反复强调的“Rust 向后兼容保证”的实践含义。
- 优先阅读改进章节:第 7 章模块快速参考(src/ch07-02-defining-modules-to-control-scope-and-privacy.md)与第 13 章闭包(src/ch13-01-closures.md)是本书针对读者反馈重点打磨的部分,适合优先精读。
五、总结
Preface 虽然只有短短几段,却承担了三个关键职责:声明本书的版本基线(Rust ≥ 1.62.0 + Edition 2021)、说明 2021 Edition 的语言改进动机、列出本书相对前版的修订重点(第 7 章快速参考、第 13 章闭包示例、全文勘误)。它同时连接着仓库中两个重要的延伸文档:src/ch01-01-installation.md(安装与更新 Rust)与 src/appendix-05-editions.md(Edition 机制详解)。理解这份前言,等于理解了整本书在“哪个 Rust 版本、哪个 Edition 语义”下写作,以及读者应当如何配置自己的环境来获得一致的阅读与运行体验。
- 教程
- 文档
【免费下载链接】book
The Rust Programming Language
相关推荐
TandoorRecipes 外部连接器(Connectors)实战:将购物清单双向同步到 HomeAssistant
TandoorRecipes 外部连接器(Connectors)实战:将购物清单双向同步到 HomeAssistant Connectors(外部连接器)是 T
教程文档《The Rust Programming Language》旧版跳转页解读:const 与 static 的权威定义与全书导航
《The Rust Programming Language》旧版跳转页解读:const 与 static 的权威定义与全书导航 本文基于当前仓库 redire
教程文档Rust 高级特性完全指南:Unsafe、高级 Trait、类型系统与宏(The Rust Programming Language 第 20 章深度解析)
Rust 高级特性完全指南:Unsafe、高级 Trait、类型系统与宏(The Rust Programming Language 第 20 章深度解析) 本
教程文档
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考