附录 A:关键字速查¶
这份附录是什么: Rust 全部保留字的两栏清单——当前在用的,和留给将来的。 用途是查证"这个词能不能拿来做变量名"。真正的知识点只有三个,下文讲完; 清单本体当字典用。
1. 两条规则¶
规则一:保留字不能当标识符。 标识符指函数名、变量名、字段名、模块名等的统称——附录开头就给了这个定义1。let match = 5 或 fn loop() {} 直接语法错误。
规则二:有救星——raw identifier(原始标识符)。 在保留字前加 r# 就能把它当普通名字用:let r#match = 5; 合法。实用场景:把 2015 版的旧代码迁到 2018 版时,有个 crate 或模块恰好叫 try(2018 起 try 成了关键字),改名牵涉所有下游,r#try 让你原地不动2。
2. "保留给将来"一栏说明了 Rust 的设计习惯¶
清单里有一批"目前没有任何功能、纯粹占位"的词(如 gen、yeet、macro)。语言提前圈地,防止生态把这些好名字用光——哪天新特性落地需要新关键字,不至于逼着全世界改名(就像 2018 版的 async 之于旧代码,raw identifier 是补救,占位是预防)3。
3. 与 edition 的联动¶
每个在用关键字首次进入语言时,都会写进某个 edition 的发布说明。edition 机制(附录 E)保证:不主动升级 edition 的旧代码,即使编译器版本一直更新,也永远按旧关键字集编译——这就是"关键字是编译期概念、edition 决定用哪套"的分工。
4. 在用关键字按用途速记¶
不必背全表,按用途归拢后各记两三个代表,查表时有线索:
| 用途 | 代表 |
|---|---|
| 定义项 | fn、struct、enum、trait、impl、mod、const、static、type |
| 控制流 | if/else、match、loop/while/for、break/continue、return |
| 所有权与借用 | let、mut、move、ref、dyn |
| 可见性 | pub、crate、super、self |
| 泛型与限定 | where、as、in |
| 异步与并发 | async、await(2018 起) |
| 杂项 | unsafe、extern、use |
5. 我们的判断¶
判断(我们的,不是书里的): 这份附录最有意思的不是清单,而是 raw identifier 的存在本身—— 它承认了"语言演进一定会撞碎已有代码"这个必然,并给了一个迁移期的逃生门。 和 edition 的"不升级就不变"配合,构成 Rust 对"兼容性"的完整答案: 默认不动你,要动就给你逃生门。 如果错,会错在: 逃生门也有代价——
r#前缀在宏和代码生成里会添乱, 长期看社区仍倾向"撞名就改",raw identifier 更像迁移工具而非永久方案。
6. 可带走的¶
- 保留字不能当标识符;
r#保留字可以。 - "保留给将来"一栏是预防性圈地。
- 新关键字随 edition 落地,旧 edition 代码不受影响。
7. 原文地图¶
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 标识符定义与总述 | Appendix A: Keywords | text/29-apx-a-appendix-a-keywords.txt:7(搜「as identifiers」) |
| 在用关键字清单 | 同上 | text/29-apx-a-appendix-a-keywords.txt:13(搜「Keywords Currently in Use」) |
| 保留给将来 | 同上 | text/29-apx-a-appendix-a-keywords.txt:62(搜「Reserved for Future Use」) |
| raw identifier | 同上 | text/29-apx-a-appendix-a-keywords.txt:8(搜「Raw Identifiers」) |