Update Ch21

This commit is contained in:
Peng Hailin, 2023-04-08 16:53:34 +08:00
parent 41d85c7a74
commit 5d9971bf50
4 changed files with 62 additions and 12 deletions

View File

@ -7,7 +7,7 @@
- Rust 的包管理器和构建系统 Cargo 的使用。
## <a id="installation"></a>安装
## <a id="installation"></a> 安装
第一步即是安装 Rust。这里将通过 `rustup` 这个用于管理 Rust 版本及相关工具的命令行工具,来下载 Rust。要下载 Rust就需要互联网连接。
@ -64,7 +64,7 @@ $ rustup update
$ rustup self uninstall
```
## <a id="troubleshooting"></a>故障排除
## <a id="troubleshooting"></a> 故障排除
要检查当前是否安装了 Rust, 请开启一个 `shell` 并敲入这行命令:
@ -116,7 +116,7 @@ $ cd hello_world
> cd hello_world
```
### <a id="writing-and-running-a-rust-program"></a>编写及运行 Rust 程序
### <a id="writing-and-running-a-rust-program"></a> 编写及运行 Rust 程序
接下来,就要构造一个源代码文件,并命名为 `main.rs`。Rust 文件总是以 `.rs` 扩展名结束。若要在文件名中是一多个单词,那么请使用下划线来将这些单词隔开。比如,请使用 `hello_world.rs` 而不是 `helloworld.rs`

View File

@ -108,7 +108,7 @@ fn main() {
这段代码在打印提示消息,表明该游戏是什么及正在请求用户输入。
## <a id="storing-values-with-variables"></a>使用变量保存那些值
## <a id="storing-values-with-variables"></a> 使用变量保存那些值
接下来,就要创建一个 *变量variable* 来存储用户输入,像下面这样:
@ -152,7 +152,7 @@ let mut bananas = 5; // 可变mutable
其中的 `&` 表明该参数是个 *引用reference*,而引用则是一种无需将数据多次拷贝到内存中的情况下,就可以实现代码多个部分对该数据进行读写的特性(注:在 C 家族语言中,`&`表示内存地址,因此 Rust 中的引用,与指针有类似之处)。引用是一项复杂特性,同时 Rust 的主要优点之一,就是安全而便利地运用引用的方式。对于完成这个猜数游戏,是不必对这些细节有过多了解的。现在要明白的是,与变量类似,引用默认也是不可变的。因此,这里就要写上 `&mut guess` 而不是 `&guess`,来令到这个到 `guess` 的引用为可变的。(第 4 章将更详细地对引用进行解释。)
## <a id="handling-potential-failure-with-the-result-type"></a>处理潜在的带有 `Result` 的程序失效
## <a id="handling-potential-failure-with-the-result-type"></a> 处理潜在的带有 `Result` 的程序失效
**Handle Potential Failure with the `Result` Type**
@ -240,7 +240,7 @@ $ cargo run  ✔
此刻,这游戏的第一部分就算完成了:这里正从键盘获取到输入,并随后将输入打印出来。
## <a id="generating-a-random-number"></a>生成秘密数字
## <a id="generating-a-random-number"></a> 生成秘密数字
接下来,就需要生成一个用户将要试着去猜的秘密数字了。生成的秘密数字应每次都不相同,这样这游戏在多次玩的时候才有趣。为了不让这个游戏太难,这里要用一个 `1``100` 之间的随机数。Rust 在其标准库中尚未包含随机数功能。不过 Rust 团队还真的提供了一个 [`rand` 代码箱](https://crates.io/crates/rand),这里就姑且把这样的代码箱,称之为功能吧。
@ -426,7 +426,7 @@ $ cargo run  ✔ 
就会得到不同的随机数字,并且他们都应是 `1``100` 之间的数字。非常棒!
## <a id="comparing-the-guess-to-the-secret-number"></a>将猜数与秘数相比较
## <a id="comparing-the-guess-to-the-secret-number"></a> 将猜数与秘数相比较
既然有了用户输入和随机数,就可以加以比较了。比较的步骤在下面的清单 2-4 中给出了。请注意这个代码还不会编译,原因后面会解释。
@ -599,7 +599,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
敲入 `quit` 就会退出这游戏,不过正如所注意到的,这样做将就要敲入别的非数字输入。至少可以是这种做法是次优的;这里想要在猜到了正确数字时,游戏也要停止。
## <a id="quitting-after-a-correct-guess"></a>猜对后的退出
## <a id="quitting-after-a-correct-guess"></a> 猜对后的退出
下面就来通过添加一条 `break` 语句,将游戏编程为在用户赢了时退出:

View File

@ -183,7 +183,7 @@ error: could not compile `variables` due to previous error
现在已经完成变量运行机制的探讨,接卸来就要看看这些变量可以有的那些其余数据类型了。
## <a id="data-types"></a>数据类型
## <a id="data-types"></a> 数据类型
Rust 的所有值,都属于某种确切的 *数据类型data type*,数据类型告诉 Rust 所指定的是何种数据,进而 Rust 才知道该怎样使用那个数据。接下来会看看两个数据类型的子集标量scalar类型与复合compound类型。
@ -219,7 +219,7 @@ fn main() {
*标量* 类型表示单个值。Rust 有着四个主要的标量类型:整数、浮点数、布尔值与字符。这些类型,其他语言也有。下面就深入看看他们在 Rust 中是怎样工作的。
### <a id="integer-types"></a>整形Integer Types
### <a id="integer-types"></a> 整形Integer Types
*整数* 是不带小数部分的数。在第 2 章中就已用到一种整数类型,即 `u32` 类型。这种类型声明表示变量关联的值,应是个无符号的、占据 32 个二进制位空间的整数(有符号整数以 `i` 而不是 `u` 开头)。下面的表 3-1 给出了 Rust 中内建的那些整数类型。可使用这些变种中的任何一个,取声明出某个整数值的类型。
@ -363,7 +363,7 @@ fn main() {
*复合类型compound types* 可将多个值组合成一个类型。Rust 有着两个原生的复合类型元组与数组tuples and arrays
### <a id="the-tuple-type"></a>元组类型
### <a id="the-tuple-type"></a> 元组类型
元组是将数个不同类型的值,组合成一个复合类型的一般方式。元组是固定长度的:一旦被声明出来,他们的大小就无法扩大或缩小了。
@ -1170,7 +1170,7 @@ fn main() {
此代码结构,消除了使用 `loop`、`if`、`else`、及 `break` 实现同样结构时,很多不可缺少的嵌套,且此结构更为清晰。在条件保持为真期间,代码就会运行;否则,他将退出循环。
### <a id="looping-through-a-collection-with-for"></a>使用 `for` 对集合进行遍历
### <a id="looping-through-a-collection-with-for"></a> 使用 `for` 对集合进行遍历
可选择使用 `while` 结构,来对集合,诸如数组,的那些元素进行循环。作为示例,下面清单 3-4 中的循环,将打印出数组 `a` 中的各个元素。

View File

@ -260,4 +260,54 @@ fn main() {
| `$(...) ...` | 宏重复macro repetition |
| `ident! (...)`, `ident! {...}`, `ident! [...]` | 宏调用macro invocation |
下表 B-7 展示了创建注释的一些符号。
**<small>表 B-7注释</small>**
| 符号 | 说明 |
| :--- | :--- |
| `//` | 注释行 |
| `//!` | 内层行文档注释inner line doc comment |
| `///` | 外层行文档注释outter line doc comment |
| `/*...*/` | 注释块 |
| `/*!...*/` | 内层块文档注释inner block doc comment |
| `/**...*/` | 外层块文档注释outter block doc comment |
下表 B-8 展示了出现于用到元组上下文中的一些符号。
**<small>元组</small>**
| 符号 | 说明 |
| :--- | :--- |
| `()` | 空元组(又叫单元值),同时属于字面值与类型 |
| `(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 展示了其中用到花括号上下文中的一些符号。
**<small>表 B-9花括号</small>**
| 符号 | 说明 |
| :--- | :--- |
| `{...}` | 代码块表达式 |
| `Type {...}` | `struct` 的字面值 |
下表 B-10 展示了其中用到方括号上下文中的一些符号。
**<small>表 B-10方括号</small>**
| 符号 | 说明 |
| :--- | :--- |
| `[...]` | 数组的字面值 |
| `[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" |