编程语言研究书库

附录 B:运算符与符号速查 — 拆解

附录 B:运算符与符号速查

这份附录是什么: Rust 全部运算符和符号的词典,三张表。 用法:见到陌生符号回来查它在哪个语境出现、干什么。下文讲三张表的组织逻辑 和唯一值得记住的机制点;表本体当字典。

1. 顶层全景:三张表怎么切

  表 B-1 运算符      能算东西的符号(+、%、-> 等),每行四列:
                     符号 | 用例 | 含义 | 可否重载(可重载则给出 trait 名)
  表 B-2 独立符号    单独出现、不构成表达式的符号(如 _、..、@)
  表 B-3 上下文符号  只在特定结构里出现的符号(路径的 ::、引用的 &、生命周期 'a、
                     泛型的 <T>、模式里的 => 等)

  图说:分类轴是"符号出现在哪、扮演什么角色"——同一个 & 在表 1 是按位与、
  在表 3 是借用,靠上下文区分,这正是 Rust 符号密度高的原因。

2. 唯一值得记的机制:运算符重载

大多数运算符可以通过实现 std::ops 里对应的 trait 来重载(如 + 对应 Add,第 20 章的例子)。表 B-1 的第四列就是这张对照表:想让自己的类型支持 a + b,就去 impl Add for YourType1。

边界(第 20 章详述,这里一句话):不能发明新运算符,不能重载任意符号——只有语言已有的运算符、以及它们对应的 trait 可以;而 & 作为借用、:: 作为路径这类"结构性符号"不参与重载2。

3. 高频符号按语境归位

不必背表,记住几个"同一个符号多副面孔"的典型,查表时有方向:

符号面孔
&借用(表 3)/ 按位与(表 1,可重载为 BitAnd)
*解引用(表 3)/ 乘法(表 1,Mul)/ 裸指针类型 *const T(表 3)
..范围(表达式)/ 模式忽略剩余(第 19 章)/ 结构体更新语法
'字符字面量 'a' / 生命周期 'a
!宏调用 println! / 逻辑非 / never 类型
``

4. 作者的判断与证据

  • 附录本身无语义判断;重载机制的判断在第 20 章("只允许重载已有运算符")2。

判断(我们的,不是书里的): 三张表的分法是这份附录的真正设计—— 它承认 Rust 符号的语义是上下文驱动的,与其按符号聚合,不如按"你在代码的哪一层" 聚合。这也意味着读 Rust 报错时,符号本身给不了答案,它所在的结构才给。 如果错,会错在: 上下文分类偶有含糊(如 .. 横跨三表),真查起来可能要在两张表间跳; 但作为速查工具,这比按字母序好得多。

5. 可带走的

  1. 运算符能否重载、重载到哪个 trait——查表 B-1 第四列。
  2. 结构性符号(& 借用、:: 路径、'a 生命周期)不可重载。
  3. 同一符号多副面孔,先定位语境再查。

6. 原文地图

主题原书章原文位置
附录总述与三张表Appendix B: Operators and Symbolstext/30-apx-b-appendix-b-operators-and-symbols.txt:4(搜「glossary」)
表 B-1 运算符(含重载列)同上text/30-apx-b-appendix-b-operators-and-symbols.txt:11(搜「Table B-1」)
表 B-2 独立符号同上text/30-apx-b-appendix-b-operators-and-symbols.txt:126(搜「Stand-Alone Syntax」)
表 B-3 上下文符号同上text/30-apx-b-appendix-b-operators-and-symbols.txt:153(搜「Path-Related Syntax」)

Footnotes

  1. 出处:「Appendix B: Operators and Symbols」第 11 段(text/30-apx-b-appendix-b-operators-and-symbols.txt:11,搜「Table B-1」)。 ↩

  2. 出处:「Appendix B: Operators and Symbols」第 16 段(text/30-apx-b-appendix-b-operators-and-symbols.txt:16,搜「Overloadable」)。 ↩ ↩2

On this page