- 教程
- 文档
【免费下载链接】book
The Rust Programming Language
本篇技术指南以《The Rust Programming Language》(TRPL)官方仓库中的「附录 A:关键字(Keywords)」为核心骨架,系统梳理 Rust 当前使用中的全部关键字、为未来预留的关键字,以及突破命名限制的原始标识符(raw identifiers)语法。文中所有结论均以仓库源文档 src/appendix-01-keywords.md(及 nostarch 排版版 nostarch/appendix_a.md)为基准,并结合书内各章节源码级讲解交叉印证。读完本文,你将能够快速查证任意标识符是否可安全命名、理解每个关键字的职责边界,并掌握用r#前缀合法使用关键字(尤其是跨 edition 集成遗留库)的完整实战方案。
附录 A 在书中的定位与标识符概念
附录 A 位于书籍正文之后,与附录 B(运算符与符号,见 src/appendix-02-operators.md)、附录 E(editions,见 src/appendix-05-editions.md)共同构成全书语法的查证体系。该附录的仓库源文件为src/appendix-01-keywords.md,nostarch 目录下的nostarch/appendix_a.md由其自动生成,文件头部注释明确说明「此文件由 /src/ 目录内容周期性生成,所有修订需在 /src/ 中完成」——这也解释了为什么两份文件正文完全一致。
正文开篇即给出关键定义:
Rust 语言为当前或未来使用保留了以下关键字。正因如此,它们不能用作标识符(除非使用原始标识符)。标识符是函数、变量、参数、结构体字段、模块、crate、常量、宏、静态值、属性、类型、trait 或生命周期的名称。
这意味着:无论是定义一个函数、一个变量、一个 struct 字段还是一个 crate 名,只要与关键字撞名,编译器都会拒绝。理解这份清单,是编写可编译代码、排查命名冲突错误的前提。
当前使用中的关键字(共 39 个)
以下列表完整收录附录 A 中「当前使用中」的全部 39 个关键字(依据 src/appendix-01-keywords.md 逐条统计),每项保留附录原始功能描述,并按使用场景归类,方便速查。
控制流与分支
break:立即退出循环。continue:跳到循环的下一次迭代。else:if与if let控制流结构的兜底分支。if:根据条件表达式的结果分支。in:for循环语法的一部分。loop:无条件循环。match:将值与模式进行匹配(书中 ch06-02-match.md 有完整专题)。return:从函数返回。while:基于表达式结果条件循环。for:遍历迭代器中的项、实现 trait,或指定高阶生命周期(higher ranked lifetime)。
类型、项定义与代码组织
const:定义常量项或常量裸指针。enum:定义枚举。extern:链接外部函数或变量(FFI)。fn:定义函数,或表示函数指针类型。impl:实现固有(inherent)功能或 trait 功能。let:绑定变量。mod:定义模块。static:全局变量,或持续整个程序执行期间的生命周期。struct:定义结构体。trait:定义 trait。type:定义类型别名或关联类型。union:定义联合体;仅在 union 声明中使用时才作为关键字(即union关键字只有在声明 union 时生效,其他语境下并非关键字)。
作用域、路径与可见性
crate:在模块路径中,指代 crate 根。self:方法主体,或当前模块。Self:所定义或所实现类型的类型别名(注意大小写敏感,Self与self是两个不同的关键字)。super:当前模块的父模块。pub:标记结构体字段、impl块或模块中的公共可见性。use:将符号引入当前作用域。as:执行基本类型转换(primitive casting)、消除包含某条目的具体 trait 的歧义,或在use语句中重命名条目。
所有权、借用与闭包
move:使闭包获得其所有捕获的所有权。mut:标记引用、裸指针或模式绑定中的可变性。ref:按引用绑定。
异步编程
async:返回一个Future而不是阻塞当前线程。await:挂起执行,直到某个Future的结果就绪。
布尔字面量与其余关键字
false:布尔假字面量。true:布尔真字面量。dyn:对 trait 对象的动态分发。unsafe:标记不安全代码、函数、trait 或实现。where:标记约束类型的子句。
关键字语义深入:从附录到正文的交叉印证
附录 A 只给出每个关键字的一句话功能描述,真正的实战语义分布在书籍各章。以下选取几组高频关键字,结合仓库内对应章节展开说明,帮助你理解「为何这些词被保留」。
async 与 await:异步编程的两个支柱
async与await是附录在 2018 版(Rust 2018 edition)新增的关键字。src/ch17-01-futures-and-syntax.md 指出,async fn实际上会被编译器改写为「返回Future的普通函数,函数体是一个 async 块」;async 块是惰性的,Rust 会避免在真正需要前执行异步代码。await关键字只能出现在 async 函数或 async 块内部,因为异步代码需要运行时(runtime)驱动:
async fn page_title(url: &str) -> Option<String> { let text = trpl::get(url).await.text().await; text.html().find_first("title").map(|title| title.inner_html()) }书中还演示了async move块的用法,并明确说明main不能标记为async——异步代码需要 runtime(如 Tokio、trpl::block_on)才能执行。这正是async/await被保留、且main只能作为普通函数入口的原因。
use、as 与 pub use:作用域导入的完整工具箱
use将符号引入作用域,as提供重命名能力,pub use则实现「再导出(re-export)」。本章节在 src/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md 中有完整教学:
use std::collections::HashMap; // 直接导入项 use std::io::Result as IoResult; // as 别名,解决同名冲突 pub use crate::front_of_house::hosting; // 再导出,让外部调用方用更短路径要点包括:use只在声明处所在作用域内生效(换一个作用域需要重新引入);引入函数时惯例是导入其父模块,而引入 struct、enum 等项时惯例是导入完整路径;同名类型冲突时可用as起别名,或用std::fmt::Result/std::io::Result的父模块路径区分;嵌套路径(use std::{io, io::Write})与 glob 运算符(use std::collections::*;)可精简导入列表。这些能力共同决定了use、as、self、pub等关键字在路径体系中的不可替代地位。
self / Self / super / crate:模块路径四件套
self表示当前模块,可用于use self::module::Item显式区分路径起点;Self是「正在定义或实现的类型」的类型别名,在impl块与 trait 方法返回值中大量出现(如fn new() -> Self);super指向父模块,用于相对路径上行;crate指向 crate 根,构成绝对路径的起点(如crate::front_of_house::hosting)。
dyn、move、mut、ref:与语言核心机制绑定的保留词
dyn用于 trait 对象,实现动态分发(见 src/ch18-02-trait-objects.md)。Box<dyn Draw>这类写法让一组实现了同一 trait 的不同类型可以被统一引用。move让闭包强制获得捕获变量的所有权(见 src/ch13-01-closures.md),常用于将数据移入新线程等需要所有权转移的场景。mut贯穿引用与模式绑定,是可变性的唯一入口;ref在模式中按引用绑定,与&在表达式中的借用相对应(模式语法详解见 src/ch19-03-pattern-syntax.md)。unsafe是 Rust 中「不保证安全」的显式开关(见 src/ch20-01-unsafe-rust.md),用于解引用裸指针、调用外部函数、访问可变静态量、实现不安全 trait 等场景。
为未来保留的关键字(14 个)
以下关键字目前没有任何功能,但被 Rust 预留用于未来可能的使用。把它们当作不可用的标识符即可:
abstractbecomeboxdofinalgenmacrooverrideprivtrytypeofunsizedvirtualyield
值得注意的是,这份「保留」清单是动态的:其中try已在 2018 edition 中从「保留」转为「当前使用」,gen则在较新版本中开始承载生成器相关语义。附录 A 强调,这些词「尚不具备任何功能」,因此即便当前编译器允许在某些位置使用(如box曾作为老式指针语法),也不应依赖其未定义的行为。如需完整清单,可直接核对仓库中的 src/appendix-01-keywords.md。
原始标识符(Raw Identifiers):用 r# 合法使用关键字
原始标识符是允许你在正常情况下不允许使用关键字的位置使用关键字的语法:只需在关键字前加上r#前缀即可。
例如,match是关键字。如果试图编译下面这个以match命名的函数(源码对应仓库中的src/main.rs文件):
fn match(needle: &str, haystack: &str) -> bool { haystack.contains(needle) }编译器会报出如下错误:
error: expected identifier, found keyword `match` --> src/main.rs:4:4 | 4 | fn match(needle: &str, haystack: &str) -> bool { | ^^^^^ expected identifier, found keyword错误信息表明,你不能把关键字match用作函数标识符。要将match用作函数名,需要使用原始标识符语法:
fn r#match(needle: &str, haystack: &str) -> bool { haystack.contains(needle) } fn main() { assert!(r#match("foo", "foobar")); }这段代码可以无错编译。注意r#前缀同时出现在函数定义处和main中调用处。
原始标识符的三大实际用途
- 自由命名:原始标识符允许你使用任何你选择的词作为标识符,即使该词恰巧是保留关键字。这给了你更多选择标识符名的自由度。
- 跨语言集成:当你的 Rust 程序需要与某种「不把这些词当关键字」的语言编写的程序集成时(例如通过 FFI 调用外部符号),
r#让这些符号可以直接在 Rust 侧引用。 - 跨 edition 使用库:原始标识符还允许你使用以与你 crate 不同的 Rust edition 编写的库。
跨 edition 集成:r#try 实战场景
第三点对应附录 E 的说明。以try为例:try在 2015 edition 中不是关键字,但在 2018、2021 和 2024 edition 中都是关键字(src/appendix-05-editions.md 明确记载当前有 2015、2018、2021、2024 四种 edition,本书正文按 2024 edition 编写)。假设你依赖一个用 2015 edition 编写、并导出了名为try的函数的库:
- 你的项目运行在 2018 或更高 edition,
try已是关键字,直接写try(...)无法编译; - 解决办法是使用原始标识符语法
r#try来调用该函数。
edition 机制保证了「同一份代码在不同 edition 下解析方式不同」,而r#正是跨过这条解析边界的通行证。附录 E 还指出:edition 切换只影响编译器最初解析代码的方式,因此「2015 项目依赖 2018 库」与「2018 项目依赖 2015 库」都可以正常编译链接;新关键字的引入正是 edition 可能带来不兼容变更的典型例子。
如何在本仓库中查阅与验证
- 附录 A 源文档:src/appendix-01-keywords.md(含原始标识符完整示例与错误输出);nostarch 排版版见 nostarch/appendix_a.md,两者内容一致。
- 附录 B(运算符与符号):src/appendix-02-operators.md,覆盖
::、->、&等与关键字互补的符号语法。 - 附录 E(editions):src/appendix-05-editions.md,解释 edition 与关键字演进的关联、
Cargo.toml中edition键的默认值(缺省为 2015)及cargo fix自动升级工具。 - 正文交叉章节:
use/as/pub use(src/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md)、async/await(src/ch17-01-futures-and-syntax.md)、dyntrait 对象(src/ch18-02-trait-objects.md)、模式中的mut/ref(src/ch19-03-pattern-syntax.md)、unsafe(src/ch20-01-unsafe-rust.md)。
建议把本文(或附录 A 源文件)作为日常开发的关键字速查表:遇到expected identifier, found keyword编译错误时,先核对目标词是否在本附录清单中;若是,改用r#前缀,或按附录 E 的方法评估是否需要切换 edition。这样既能写出符合 edition 规范的现代 Rust 代码,也能平滑兼容历史库与外部符号。
- 教程
- 文档
【免费下载链接】book
The Rust Programming Language
相关推荐
5 轮对话把模糊念头逼成可执行决策:grill-me 无状态访谈协议全解
5 轮对话把模糊念头逼成可执行决策:grill me 无状态访谈协议全解 脑子里有个念头,转了两天说不清楚:方向像是对的,但每想推进一步就撞上一个没答案的细节。
教程文档《The Rust Programming Language》附录 D 精讲:rustfmt、cargo fix、Clippy 与 rust-analyzer 开发工具链实战
《The Rust Programming Language》附录 D 精讲:rustfmt、cargo fix、Clippy 与 rust analyzer
教程文档Rust 关键字速查手册:C 开发者视角下的核心语法对照与实战要义
Rust 关键字速查手册:C 开发者视角下的核心语法对照与实战要义 本文是 Rust for C Programmers https://link.gitcod
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考