From 5d9971bf50faf887fc3f2d1f87315eda4295e7ad Mon Sep 17 00:00:00 2001 From: "Peng Hailin," Date: Sat, 8 Apr 2023 16:53:34 +0800 Subject: [PATCH] Update Ch21 --- src/Ch01_Getting_Started.md | 6 +-- src/Ch02_Programming_a_Guessing_Game.md | 10 ++--- src/Ch03_Common_Programming_Concepts.md | 8 ++-- src/Ch21_Appendix.md | 50 +++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 12 deletions(-) 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" | + +