编程语言研究书库

附录 A:关键字速查 — 拆解

附录 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. 可带走的

  1. 保留字不能当标识符;r#保留字 可以。
  2. "保留给将来"一栏是预防性圈地。
  3. 新关键字随 edition 落地,旧 edition 代码不受影响。

7. 原文地图

主题原书章原文位置
标识符定义与总述Appendix A: Keywordstext/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」)

Footnotes

  1. 出处:「Appendix A: Keywords」第 7 段(text/29-apx-a-appendix-a-keywords.txt:7,搜「as identifiers」)。 ↩

  2. 出处:「Appendix A: Keywords」第 8 段(text/29-apx-a-appendix-a-keywords.txt:8,搜「Raw Identifiers」)。 ↩

  3. 出处:「Appendix A: Keywords」第 62 段(text/29-apx-a-appendix-a-keywords.txt:62,搜「Reserved for Future Use」)。 ↩

On this page