update ch19-01

main
KaiserY 6 days ago
parent d240e1e2ab
commit 0ac1ea7646

@ -37,9 +37,9 @@ match x {
第六章讨论过了 `if let` 表达式,以及它是如何主要用于编写等同于只关心一个情况的 `match` 语句简写的。`if let` 可以对应一个可选的带有代码的 `else``if let` 中的模式不匹配时运行。
示例 18-1 展示了也可以组合并匹配 `if let`、`else if` 和 `else if let` 表达式。这相比 `match` 表达式一次只能将一个值与模式比较提供了更多灵活性。并且 Rust 并不要求一系列 `if let`、`else if`、`else if let` 分支的条件相互关联。
示例 19-1 展示了也可以组合并匹配 `if let`、`else if` 和 `else if let` 表达式。这相比 `match` 表达式一次只能将一个值与模式比较提供了更多灵活性。并且 Rust 并不要求一系列 `if let`、`else if`、`else if let` 分支的条件相互关联。
示例 18-1 中的代码展示了一系列针对不同条件的检查来决定背景颜色应该是什么。为了达到这个例子的目的,我们创建了硬编码值的变量,在真实程序中则可能由询问用户获得。
示例 19-1 中的代码展示了一系列针对不同条件的检查来决定背景颜色应该是什么。为了达到这个例子的目的,我们创建了硬编码值的变量,在真实程序中则可能由询问用户获得。
<span class="filename">文件名src/main.rs</span>
@ -47,7 +47,7 @@ match x {
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-01/src/main.rs}}
```
<span class="caption">示例 18-1: 结合 `if let`、`else if`、`else if let` 以及 `else`</span>
<span class="caption">示例 19-1: 结合 `if let`、`else if`、`else if let` 以及 `else`</span>
如果用户指定了中意的颜色,将使用其作为背景颜色。如果没有指定中意的颜色且今天是星期二,背景颜色将是绿色。如果用户指定了他们的年龄字符串并能够成功将其解析为数字的话,我们将根据这个数字使用紫色或者橙色。最后,如果没有一个条件符合,背景颜色将是蓝色。
@ -59,27 +59,27 @@ match x {
### `while let` 条件循环
一个与 `if let` 结构类似的是 `while let` 条件循环,它允许只要模式匹配就一直进行 `while` 循环。示例 18-2 展示了一个使用 `while let` 的例子,它使用 vector 作为栈并以先进后出的方式打印出 vector 中的值:
一个与 `if let` 结构类似的是 `while let` 条件循环,它允许只要模式匹配就一直进行 `while` 循环。我们在第十七章第一次见到 `while let` 循环,当时我们使用它在流还在产生新值的时候保持循环。同理在示例 19-2 展示了一个 `while let` 循环等待跨线程发送的消息,不过在这个示例中它检查一个 `Result` 而不是 `Option`
```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-02/src/main.rs:here}}
```
<span class="caption">列表 18-2: 使用 `while let` 循环只要 `stack.pop()` 返回 `Some` 就打印出其值</span>
<span class="caption">示例 19-2: 使用 `while let` 循环只要 `rx.recv()` 返回 `Ok` 就打印出其值</span>
这个例子会打印出 3、2 接着是 1。`pop` 方法取出 vector 的最后一个元素并返回 `Some(value)`。如果 vector 是空的,它返回 `None`。`while` 循环只要 `pop` 返回 `Some` 就会一直运行其块中的代码。一旦其返回 `None``while` 循环停止。我们可以使用 `while let` 来弹出栈中的每一个元素
这个例子会打印出 1、2 和 3。当在第十六章遇到 `recv` 时,我们直接 unwrap 了错误,或者使用 `for` 循环将其视为迭代器处理。不过如示例 19-2 所示,我们也可以使用 `while let`,因为 `recv` 方法只要发送端持续产生消息它就一直返回 `Ok`,并在发送端断开连接后产生一个 `Err`
### `for` 循环
`for` 循环中,模式是 `for` 关键字直接跟随的值,正如 `for x in y` 中的 `x`。示例 18-3 中展示了如何使用 `for` 循环来解构,或拆开一个元组作为 `for` 循环的一部分:
`for` 循环中,模式是 `for` 关键字直接跟随的值,正如 `for x in y` 中的 `x`。示例 19-3 中展示了如何使用 `for` 循环来解构,或拆开一个元组作为 `for` 循环的一部分:
```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-03/src/main.rs:here}}
```
<span class="caption">列表 18-3: 在 `for` 循环中使用模式来解构元组</span>
<span class="caption">列表 19-3: 在 `for` 循环中使用模式来解构元组</span>
示例 18-3 的代码会打印出:
示例 19-3 的代码会打印出:
```console
{{#include ../listings/ch19-patterns-and-matching/listing-19-03/output.txt}}
@ -103,23 +103,23 @@ let PATTERN = EXPRESSION;
`let x = 5;` 这样的语句中变量名位于 `PATTERN` 位置,变量名不过是形式特别朴素的模式。我们将表达式与模式比较,并为任何找到的名称赋值。所以例如 `let x = 5;` 的情况,`x` 是一个代表 “将匹配到的值绑定到变量 x” 的模式。同时因为名称 `x` 是整个模式,这个模式实际上等于 “将任何值绑定到变量 `x`,不管值是什么”。
为了更清楚的理解 `let` 的模式匹配方面的内容,考虑示例 18-4 中使用 `let` 和模式解构一个元组:
为了更清楚的理解 `let` 的模式匹配方面的内容,考虑示例 19-4 中使用 `let` 和模式解构一个元组:
```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-04/src/main.rs:here}}
```
<span class="caption">示例 18-4: 使用模式解构元组并一次创建三个变量</span>
<span class="caption">示例 19-4: 使用模式解构元组并一次创建三个变量</span>
这里将一个元组与模式匹配。Rust 会比较值 `(1, 2, 3)` 与模式 `(x, y, z)` 并发现此值匹配这个模式。在这个例子中,将会把 `1` 绑定到 `x``2` 绑定到 `y` 并将 `3` 绑定到 `z`。你可以将这个元组模式看作是将三个独立的变量模式结合在一起。
如果模式中元素的数量不匹配元组中元素的数量,则整个类型不匹配,并会得到一个编译时错误。例如,示例 18-5 展示了尝试用两个变量解构三个元素的元组,这是不行的:
如果模式中元素的数量不匹配元组中元素的数量,则整个类型不匹配,并会得到一个编译时错误。例如,示例 19-5 展示了尝试用两个变量解构三个元素的元组,这是不行的:
```rust,ignore,does_not_compile
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-05/src/main.rs:here}}
```
<span class="caption">示例 18-5: 一个错误的模式结构,其中变量的数量不符合元组中元素的数量</span>
<span class="caption">示例 19-5: 一个错误的模式结构,其中变量的数量不符合元组中元素的数量</span>
尝试编译这段代码会给出如下类型错误:
@ -131,15 +131,15 @@ let PATTERN = EXPRESSION;
### 函数参数
函数参数也可以是模式。列表 18-6 中的代码声明了一个叫做 `foo` 的函数,它获取一个 `i32` 类型的参数 `x`,现在这看起来应该很熟悉:
函数参数也可以是模式。列表 19-6 中的代码声明了一个叫做 `foo` 的函数,它获取一个 `i32` 类型的参数 `x`,现在这看起来应该很熟悉:
```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-06/src/main.rs:here}}
```
<span class="caption">列表 18-6: 在参数中使用模式的函数签名</span>
<span class="caption">列表 19-6: 在参数中使用模式的函数签名</span>
`x` 部分就是一个模式!类似于之前对 `let` 所做的,可以在函数参数中匹配元组。列表 18-7 将传递给函数的元组拆分为值:
`x` 部分就是一个模式!类似于之前对 `let` 所做的,可以在函数参数中匹配元组。列表 19-7 将传递给函数的元组拆分为值:
<span class="filename">文件名src/main.rs</span>
@ -147,7 +147,7 @@ let PATTERN = EXPRESSION;
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-07/src/main.rs}}
```
<span class="caption">列表 18-7: 一个在参数中解构元组的函数</span>
<span class="caption">列表 19-7: 一个在参数中解构元组的函数</span>
这会打印出 `Current location: (3, 5)`。值 `&(3, 5)` 会匹配模式 `&(x, y)`,如此 `x` 得到了值 `3`,而 `y`得到了值 `5`

Loading…
Cancel
Save