diff --git a/src/Ch01_Getting_Started.md b/src/Ch01_Getting_Started.md
index c5188d8..eca989c 100644
--- a/src/Ch01_Getting_Started.md
+++ b/src/Ch01_Getting_Started.md
@@ -7,7 +7,7 @@
- Rust 的包管理器和构建系统 Cargo 的使用。
-## 安装
+## 安装
第一步即是安装 Rust。这里将通过 `rustup` 这个用于管理 Rust 版本及相关工具的命令行工具,来下载 Rust。要下载 Rust,就需要互联网连接。
@@ -64,7 +64,7 @@ $ rustup update
$ rustup self uninstall
```
-## 故障排除
+## 故障排除
要检查当前是否安装了 Rust, 请开启一个 `shell` 并敲入这行命令:
@@ -116,7 +116,7 @@ $ cd hello_world
> cd hello_world
```
-### 编写及运行 Rust 程序
+### 编写及运行 Rust 程序
接下来,就要构造一个源代码文件,并命名为 `main.rs`。Rust 文件总是以 `.rs` 扩展名结束。若要在文件名中是一多个单词,那么请使用下划线来将这些单词隔开。比如,请使用 `hello_world.rs` 而不是 `helloworld.rs`。
diff --git a/src/Ch02_Programming_a_Guessing_Game.md b/src/Ch02_Programming_a_Guessing_Game.md
index 22f98db..8677533 100644
--- a/src/Ch02_Programming_a_Guessing_Game.md
+++ b/src/Ch02_Programming_a_Guessing_Game.md
@@ -108,7 +108,7 @@ fn main() {
这段代码在打印提示消息,表明该游戏是什么及正在请求用户输入。
-## 使用变量保存那些值
+## 使用变量保存那些值
接下来,就要创建一个 *变量(variable)* 来存储用户输入,像下面这样:
@@ -152,7 +152,7 @@ let mut bananas = 5; // 可变(mutable)
其中的 `&` 表明该参数是个 *引用(reference)*,而引用则是一种无需将数据多次拷贝到内存中的情况下,就可以实现代码多个部分对该数据进行读写的特性(注:在 C 家族语言中,`&`表示内存地址,因此 Rust 中的引用,与指针有类似之处)。引用是一项复杂特性,同时 Rust 的主要优点之一,就是安全而便利地运用引用的方式。对于完成这个猜数游戏,是不必对这些细节有过多了解的。现在要明白的是,与变量类似,引用默认也是不可变的。因此,这里就要写上 `&mut guess` 而不是 `&guess`,来令到这个到 `guess` 的引用为可变的。(第 4 章将更详细地对引用进行解释。)
-## 处理潜在的带有 `Result` 的程序失效
+## 处理潜在的带有 `Result` 的程序失效
**Handle Potential Failure with the `Result` Type**
@@ -240,7 +240,7 @@ $ cargo run ✔
此刻,这游戏的第一部分就算完成了:这里正从键盘获取到输入,并随后将输入打印出来。
-## 生成秘密数字
+## 生成秘密数字
接下来,就需要生成一个用户将要试着去猜的秘密数字了。生成的秘密数字应每次都不相同,这样这游戏在多次玩的时候才有趣。为了不让这个游戏太难,这里要用一个 `1` 到 `100` 之间的随机数。Rust 在其标准库中尚未包含随机数功能。不过 Rust 团队还真的提供了一个 [`rand` 代码箱](https://crates.io/crates/rand),这里就姑且把这样的代码箱,称之为功能吧。
@@ -426,7 +426,7 @@ $ cargo run ✔
就会得到不同的随机数字,并且他们都应是 `1` 到 `100` 之间的数字。非常棒!
-## 将猜数与秘数相比较
+## 将猜数与秘数相比较
既然有了用户输入和随机数,就可以加以比较了。比较的步骤在下面的清单 2-4 中给出了。请注意这个代码还不会编译,原因后面会解释。
@@ -599,7 +599,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
敲入 `quit` 就会退出这游戏,不过正如所注意到的,这样做将就要敲入别的非数字输入。至少可以是这种做法是次优的;这里想要在猜到了正确数字时,游戏也要停止。
-## 猜对后的退出
+## 猜对后的退出
下面就来通过添加一条 `break` 语句,将游戏编程为在用户赢了时退出:
diff --git a/src/Ch03_Common_Programming_Concepts.md b/src/Ch03_Common_Programming_Concepts.md
index 4d1c473..a2fd9ab 100644
--- a/src/Ch03_Common_Programming_Concepts.md
+++ b/src/Ch03_Common_Programming_Concepts.md
@@ -183,7 +183,7 @@ error: could not compile `variables` due to previous error
现在已经完成变量运行机制的探讨,接卸来就要看看这些变量可以有的那些其余数据类型了。
-## 数据类型
+## 数据类型
Rust 的所有值,都属于某种确切的 *数据类型(data type)*,数据类型告诉 Rust 所指定的是何种数据,进而 Rust 才知道该怎样使用那个数据。接下来会看看两个数据类型的子集:标量(scalar)类型与复合(compound)类型。
@@ -219,7 +219,7 @@ fn main() {
*标量* 类型,表示单个值。Rust 有着四个主要的标量类型:整数、浮点数、布尔值与字符。这些类型,其他语言也有。下面就深入看看他们在 Rust 中是怎样工作的。
-### 整形(Integer Types)
+### 整形(Integer Types)
*整数* 是不带小数部分的数。在第 2 章中就已用到一种整数类型,即 `u32` 类型。这种类型声明表示变量关联的值,应是个无符号的、占据 32 个二进制位空间的整数(有符号整数以 `i` 而不是 `u` 开头)。下面的表 3-1 给出了 Rust 中内建的那些整数类型。可使用这些变种中的任何一个,取声明出某个整数值的类型。
@@ -363,7 +363,7 @@ fn main() {
*复合类型(compound types)* 可将多个值组合成一个类型。Rust 有着两个原生的复合类型:元组与数组(tuples and arrays)。
-### 元组类型
+### 元组类型
元组是将数个不同类型的值,组合成一个复合类型的一般方式。元组是固定长度的:一旦被声明出来,他们的大小就无法扩大或缩小了。
@@ -1170,7 +1170,7 @@ fn main() {
此代码结构,消除了使用 `loop`、`if`、`else`、及 `break` 实现同样结构时,很多不可缺少的嵌套,且此结构更为清晰。在条件保持为真期间,代码就会运行;否则,他将退出循环。
-### 使用 `for` 对集合进行遍历
+### 使用 `for` 对集合进行遍历
可选择使用 `while` 结构,来对集合,诸如数组,的那些元素进行循环。作为示例,下面清单 3-4 中的循环,将打印出数组 `a` 中的各个元素。
diff --git a/src/Ch21_Appendix.md b/src/Ch21_Appendix.md
index 96039c9..7065765 100644
--- a/src/Ch21_Appendix.md
+++ b/src/Ch21_Appendix.md
@@ -260,4 +260,54 @@ fn main() {
| `$(...) ...` | 宏重复,macro repetition |
| `ident! (...)`, `ident! {...}`, `ident! [...]` | 宏调用,macro invocation |
+下表 B-7 展示了创建注释的一些符号。
+
+**表 B-7:注释**
+
+| 符号 | 说明 |
+| :--- | :--- |
+| `//` | 注释行 |
+| `//!` | 内层行文档注释,inner line doc comment |
+| `///` | 外层行文档注释,outter line doc comment |
+| `/*...*/` | 注释块 |
+| `/*!...*/` | 内层块文档注释,inner block doc comment |
+| `/**...*/` | 外层块文档注释,outter block doc comment |
+
+下表 B-8 展示了出现于用到元组上下文中的一些符号。
+
+**元组**
+
+| 符号 | 说明 |
+| :--- | :--- |
+| `()` | 空元组(又叫单元值),同时属于字面值与类型 |
+| `(expr)` | 元括号括起来的表达式,parenthesized expression |
+| `(expr,)` | 单一元素的元组表达式 |
+| `(type,)` | 单一元素的元组类型,single-element tuple type |
+| `(expr, ...)` | 元组表达式 |
+| `(type, ...)` | 元组类型,tuple type |
+| `expr(expr, ...)` | 函数调用表达式;还用于初始化一些元组的 `struct` 以及元组的 `enum` 变种,function call expression; also used to initialize tuple `struct`s and tuple `enum` vairants |
+| `expr.0`, `expr.1` 等等 | 对元组进行索引 |
+
+下表 B-9 展示了其中用到花括号上下文中的一些符号。
+
+**表 B-9:花括号**
+
+| 符号 | 说明 |
+| :--- | :--- |
+| `{...}` | 代码块表达式 |
+| `Type {...}` | `struct` 的字面值 |
+
+下表 B-10 展示了其中用到方括号上下文中的一些符号。
+
+**表 B-10:方括号**
+
+| 符号 | 说明 |
+| :--- | :--- |
+| `[...]` | 数组的字面值 |
+| `[expr; len]` | 包含着 `expr` 的 `len` 拷贝数组的字面值 |
+| `[type; len]` | 包含着 `len` 个 `type` 的实例数组的字面值 |
+| `expr[expr]` | 对集合进行索引,collection indexing。是可过载的 `(Index, IndexMut)`,overloadable `(Index, IndexMut)` |
+| `expr[..]`, `expr[a..]`, `expr[..b]`, `expr[a..b]` | 用到了 `Range`、`RangeFrom`、`RangeTo` 或 `RangeFull` 作为 “索引”的,带有集合切片集合索引,collection indexing pretending to be collection slicing, using `Range`, `RangeFrom`, `RangeTo`, or `RangeFull` as the "index" |
+
+