wip: 2024 edition

pull/875/head
kazeno 2 weeks ago
parent 012d7b71aa
commit 6709d93dad

@ -47,9 +47,9 @@
上面的代码会打印 `one or two` 上面的代码会打印 `one or two`
### 通过 `..=` 匹配值范围 ### 通过 `..=` 匹配值范围
`..=` 语法允许你匹配一个闭区间范围内的值。在如下代码中,当模式匹配任何在给定范围内的值时,该分支会执行: `..=` 语法允许你匹配一个闭区间范围range内的值。在如下代码中,当模式匹配任何在给定范围内的值时,该分支会执行:
```rust ```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/no-listing-03-ranges/src/main.rs:here}} {{#rustdoc_include ../listings/ch19-patterns-and-matching/no-listing-03-ranges/src/main.rs:here}}
@ -111,7 +111,7 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
类似的,第二个分支通过指定字段 `x` 匹配字面值 `0` 来匹配任何位于 `y` 轴上的点,并为字段 `y` 创建了变量 `y`。第三个分支没有指定任何字面值,所以其会匹配任何其他的 `Point` 并为 `x``y` 两个字段创建变量。 类似的,第二个分支通过指定字段 `x` 匹配字面值 `0` 来匹配任何位于 `y` 轴上的点,并为字段 `y` 创建了变量 `y`。第三个分支没有指定任何字面值,所以其会匹配任何其他的 `Point` 并为 `x``y` 两个字段创建变量。
在这个例子中,值 `p` 因为其 `x` 包含 0 而匹配第二个分支,因此会打印出 `On the y axis at 7` 在这个例子中,值 `p` 因为其 `x` 包含 `0` 而匹配第二个分支,因此会打印出 `On the y axis at 7`
记住 `match` 表达式一旦找到一个匹配的模式就会停止检查其它分支,所以即使 `Point { x: 0, y: 0}``x` 轴上也在 `y` 轴上,这些代码也只会打印 `On the x axis at 0` 记住 `match` 表达式一旦找到一个匹配的模式就会停止检查其它分支,所以即使 `Point { x: 0, y: 0}``x` 轴上也在 `y` 轴上,这些代码也只会打印 `On the x axis at 0`
@ -125,15 +125,15 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-15/src/main.rs}} {{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-15/src/main.rs}}
``` ```
<span class="caption">示例 19-15: 解构包含不同类型值成员的枚举</span> <span class="caption">示例 19-15: 解构包含不同类型值变体的枚举</span>
这段代码会打印出 `Change the color to red 0, green 160, and blue 255`。尝试改变 `msg` 的值来观察其他分支代码的运行。 这段代码会打印出 `Change the color to red 0, green 160, and blue 255`。尝试改变 `msg` 的值来观察其他分支代码的运行。
对于像 `Message::Quit` 这样没有任何数据的枚举成员,不能进一步解构其值。只能匹配其字面值 `Message::Quit`,因此模式中没有任何变量。 对于像 `Message::Quit` 这样没有任何数据的枚举变体,不能进一步解构其值。只能匹配其字面值 `Message::Quit`,因此模式中没有任何变量。
对于像 `Message::Move` 这样的类结构体枚举成员,可以采用类似于匹配结构体的模式。在成员名称后,使用大括号并列出字段变量以便将其分解以供此分支的代码使用。这里使用了示例 19-13 所展示的简写。 对于像 `Message::Move` 这样的类结构体枚举变体,可以采用类似于匹配结构体的模式。在变体名称后,使用大括号并列出字段变量以便将其分解以供此分支的代码使用。这里使用了示例 19-13 所展示的简写。
对于像 `Message::Write` 这样的包含一个元素,以及像 `Message::ChangeColor` 这样包含三个元素的类元组枚举成员,其模式则类似于用于解构元组的模式。模式中变量的数量必须与成员中元素的数量一致。 对于像 `Message::Write` 这样的包含一个元素,以及像 `Message::ChangeColor` 这样包含三个元素的类元组枚举变体,其模式则类似于用于解构元组的模式。模式中变量的数量必须与变体中元素的数量完全一致。
#### 解构嵌套的结构体和枚举 #### 解构嵌套的结构体和枚举
@ -145,7 +145,7 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
<span class="caption">示例 19-16: 匹配嵌套的枚举</span> <span class="caption">示例 19-16: 匹配嵌套的枚举</span>
`match` 表达式第一个分支的模式匹配一个包含 `Color::Rgb` 枚举成员的 `Message::ChangeColor` 枚举成员,然后模式绑定了 3 个内部的 `i32` 值。第二个分支的模式也匹配一个 `Message::ChangeColor` 枚举成员,但是其内部的枚举会匹配 `Color::Hsv` 枚举成员。我们可以在一个 `match` 表达式中指定这些复杂条件,即使会涉及到两个枚举。 `match` 表达式第一个分支的模式匹配一个包含 `Color::Rgb` 枚举变体的 `Message::ChangeColor` 枚举变体,然后模式绑定了三个内部的 `i32` 值。第二个分支的模式也匹配一个 `Message::ChangeColor` 枚举变体,但是其内部的枚举会匹配 `Color::Hsv` 枚举变体。我们可以在一个 `match` 表达式中指定这些复杂条件,即使会涉及到两个枚举。
#### 解构结构体和元组 #### 解构结构体和元组
@ -157,11 +157,11 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
这将复杂的类型分解成部分组件以便可以单独使用我们感兴趣的值。 这将复杂的类型分解成部分组件以便可以单独使用我们感兴趣的值。
通过模式解构是一个方便利用部分值片段的手段,比如结构体中每个单独字段的值。 通过模式解构是一个方便将值的各个片段分离开来单独使用的方式,比如结构体中每个单独字段的值。
### 忽略模式中的值 ### 忽略模式中的值
有时忽略模式中的一些值是有用的,比如 `match` 中最后捕获全部情况的分支实际上没有做任何事,但是它确实对所有剩余情况负责。有一些简单的方法可以忽略模式中全部或部分值:使用 `_` 模式(我们已经见过了),在另一个模式中使用 `_` 模式,使用一个以下划线开始的名称,或者使用 `..` 忽略所剩部分的值。让我们来分别探索如何以及为什么要这么做。 有时忽略模式中的一些值是有用的,比如 `match` 中最后捕获全部情况的分支实际上没有做任何事,但是它确实负责匹配了所有剩余的可能值。有一些方法可以忽略模式中全部或部分值:使用 `_` 模式(我们已经见过了),在另一个模式中使用 `_` 模式,使用一个以下划线开始的名称,或者使用 `..` 忽略所剩部分的值。让我们来分别探索如何以及为什么要这么做。
#### 使用 `_` 忽略整个值 #### 使用 `_` 忽略整个值
@ -181,15 +181,15 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
#### 使用嵌套的 `_` 忽略部分值 #### 使用嵌套的 `_` 忽略部分值
也可以在一个模式内部使用`_` 忽略部分值,例如,当只需要测试部分值但在期望运行的代码中没有用到其他部分时。示例 19-18 展示了负责管理设置值的代码。业务需求是用户不允许覆盖现有的自定义设置,但是可以取消设置,也可以在当前未设置时为其提供设置 也可以在一个模式内部使用`_` 忽略部分值,例如,当只需要测试部分值但在期望运行的代码中没有用到其他部分时。示例 19-18 展示了负责管理设置值的代码。业务需求是用户不允许覆盖现有的自定义设置,但是可以取消设置,也可以在当前未设置时为其提供一个值
```rust ```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-18/src/main.rs:here}} {{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-18/src/main.rs:here}}
``` ```
<span class="caption">示例 19-18: 当不需要 `Some` 中的值时在模式内使用下划线来匹配 `Some` 成员</span> <span class="caption">示例 19-18: 当不需要 `Some` 中的值时在模式内使用下划线来匹配 `Some` 变体</span>
这段代码会打印出 `Can't overwrite an existing customized value` 接着是 `setting is Some(5)`。在第一个匹配分支,我们不需要匹配或使用任一个 `Some` 成员中的值;重要的部分是需要测试 `setting_value``new_setting_value` 都为 `Some` 成员的情况。在这种情况,我们打印出为何不改变 `setting_value`,并且不会改变它。 这段代码会打印出 `Can't overwrite an existing customized value` 接着是 `setting is Some(5)`。在第一个匹配分支,我们不需要匹配或使用任一个 `Some` 变体中的值,但需要检测 `setting_value``new_setting_value` 是否均为 `Some` 变体。在这种情况下,我们打印出为何不改变 `setting_value`,并且不会改变它。
对于所有其他情况(`setting_value` 或 `new_setting_value` 任一为 `None`),这由第二个分支的 `_` 模式体现,这时确实希望允许 `new_setting_value` 变为 `setting_value` 对于所有其他情况(`setting_value` 或 `new_setting_value` 任一为 `None`),这由第二个分支的 `_` 模式体现,这时确实希望允许 `new_setting_value` 变为 `setting_value`
@ -201,9 +201,9 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
<span class="caption">示例 19-19: 忽略元组的多个部分</span> <span class="caption">示例 19-19: 忽略元组的多个部分</span>
这会打印出 `Some numbers: 2, 8, 32`,值 4 和 16 会被忽略。 这会打印出 `Some numbers: 2, 8, 32`,值 `4``16` 会被忽略。
#### 通过在名字前以一个 `_` 开头来忽略未使用的变量 #### 通过在变量名开头加 `_` 来忽略未使用的变量
如果你创建了一个变量却不在任何地方使用它Rust 通常会给你一个警告,因为未使用的变量可能会是个 bug。但是有时创建一个还未使用的变量是有用的比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头。示例 19-20 中创建了两个未使用变量,不过当编译代码时只会得到其中一个的警告: 如果你创建了一个变量却不在任何地方使用它Rust 通常会给你一个警告,因为未使用的变量可能会是个 bug。但是有时创建一个还未使用的变量是有用的比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头。示例 19-20 中创建了两个未使用变量,不过当编译代码时只会得到其中一个的警告:
@ -215,7 +215,7 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
<span class="caption">示例 19-20: 以下划线开始变量名以便去掉未使用变量警告</span> <span class="caption">示例 19-20: 以下划线开始变量名以便去掉未使用变量警告</span>
这里得到了警告说未使用变量 `y`,不过没有警告说使用 `_x` 这里得到了警告说未使用变量 `y`,不过没有警告说使用 `_x`
注意,只使用 `_` 和使用以下划线开头的名称有些微妙的不同:比如 `_x` 仍会将值绑定到变量,而 `_` 则完全不会绑定。为了展示这个区别的意义,示例 19-21 会产生一个错误。 注意,只使用 `_` 和使用以下划线开头的名称有些微妙的不同:比如 `_x` 仍会将值绑定到变量,而 `_` 则完全不会绑定。为了展示这个区别的意义,示例 19-21 会产生一个错误。
@ -237,7 +237,7 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
#### 用 `..` 忽略剩余值 #### 用 `..` 忽略剩余值
对于有多个部分的值,可以使用 `..` 语法来只使用特定部分并忽略其它值,同时避免不得不每一个忽略值列出下划线。`..` 模式会忽略模式中剩余的任何没有显式匹配的值部分。在示例 19-23 中,有一个 `Point` 结构体存放了三维空间中的坐标。在 `match` 表达式中,我们希望只操作 `x` 坐标并忽略 `y``z` 字段的值: 对于有多个部分的值,可以使用 `..` 语法来只使用特定部分并忽略其它值,从而避免不得不每一个忽略值列出下划线。`..` 模式会忽略模式中剩余的任何没有显式匹配的值部分。在示例 19-23 中,有一个 `Point` 结构体存放了三维空间中的坐标。在 `match` 表达式中,我们希望只操作 `x` 坐标并忽略 `y``z` 字段的值:
```rust ```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-23/src/main.rs:here}} {{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-23/src/main.rs:here}}
@ -247,7 +247,7 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
这里列出了 `x` 值,接着仅仅包含了 `..` 模式。这比不得不列出 `y: _``z: _` 要来得简单,特别是在处理有很多字段的结构体,但只涉及一到两个字段时的情形。 这里列出了 `x` 值,接着仅仅包含了 `..` 模式。这比不得不列出 `y: _``z: _` 要来得简单,特别是在处理有很多字段的结构体,但只涉及一到两个字段时的情形。
`..` 会扩展为所需要的值的数量。示例 19-24 展示了元组中 `..` 的应用 `..` 会扩展为所需要的值的数量。示例 19-24 展示了如何在元组中使用 `..`
<span class="filename">文件名src/main.rs</span> <span class="filename">文件名src/main.rs</span>
@ -269,7 +269,7 @@ Rust 知道 `'c'` 位于第一个模式的范围内,并会打印出 `early ASC
<span class="caption">示例 19-25: 尝试以有歧义的方式运用 `..`</span> <span class="caption">示例 19-25: 尝试以有歧义的方式运用 `..`</span>
如果编译上面的例子,会得到下面的错误: 当编译这个示例时,会得到如下错误:
```console ```console
{{#include ../listings/ch19-patterns-and-matching/listing-19-25/output.txt}} {{#include ../listings/ch19-patterns-and-matching/listing-19-25/output.txt}}
@ -279,9 +279,9 @@ Rust 不可能决定在元组中匹配 `second` 值之前应该忽略多少个
### 匹配守卫提供的额外条件 ### 匹配守卫提供的额外条件
**匹配守卫**_match guard_是一个指定于 `match` 分支模式之后的额外 `if` 条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况。 **匹配守卫**_match guard_是一个指定于 `match` 分支模式之后的额外 `if` 条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况。但是注意,它们仅在 `match` 表达式中可用,不能用于 `if let``while let` 表达式。
这个条件可以使用模式中创建的变量。示例 19-26 展示了一个 `match`,其中第一个分支有模式 `Some(x)` 还有匹配守卫 `if x % 2 == 0` (当 `x` 是偶数为真) 这个条件可以使用模式中创建的变量。示例 19-26 展示了一个 `match`,其中第一个分支有模式 `Some(x)` 还有匹配守卫 `if x % 2 == 0` (当 `x` 是偶数时为真)
```rust ```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-26/src/main.rs:here}} {{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-26/src/main.rs:here}}
@ -291,11 +291,11 @@ Rust 不可能决定在元组中匹配 `second` 值之前应该忽略多少个
上例会打印出 `The number 4 is even`。当 `num` 与模式中第一个分支比较时,因为 `Some(4)` 匹配 `Some(x)` 所以可以匹配。接着匹配守卫检查 `x` 除以 `2` 的余数是否等于 `0`,因为它等于 `0`,所以第一个分支被选择。 上例会打印出 `The number 4 is even`。当 `num` 与模式中第一个分支比较时,因为 `Some(4)` 匹配 `Some(x)` 所以可以匹配。接着匹配守卫检查 `x` 除以 `2` 的余数是否等于 `0`,因为它等于 `0`,所以第一个分支被选择。
相反如果 `num``Some(5)`,因为 `5` 除以 `2` 的余数是 `1` 不等于 `0` 所以第一个分支的匹配守卫为。接着 Rust 会前往第二个分支,这次匹配因为它没有匹配守卫所以会匹配任何 `Some` 成员 相反如果 `num``Some(5)`,因为 `5` 除以 `2` 的余数是 `1` 不等于 `0` 所以第一个分支的匹配守卫为 `false`。接着 Rust 会前往第二个分支,这次匹配因为它没有匹配守卫所以会匹配任何 `Some` 变体
无法在模式中表达类似 `if x % 2 == 0` 的条件,所以通过匹配守卫提供了表达类似逻辑的能力。这种替代表达方式的缺点是,编译器不会尝试为包含匹配守卫的模式检查穷尽性。 无法在模式中表达类似 `if x % 2 == 0` 的条件,所以通过匹配守卫提供了表达类似逻辑的能力。这种替代表达方式的缺点是,编译器不会尝试为包含匹配守卫的模式检查穷尽性。
在示例 19-11 中,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 `match` 表达式的模式中新建了一个变量而不是使用 `match` 之外的同名变量。新变量意味着不能够测试外部变量的值。示例 19-27 展示了如何使用匹配守卫修复这个问题。 在示例 19-11 中,我们提到可以使用匹配守卫来解决模式中变量遮蔽的问题,那里 `match` 表达式的模式中新建了一个变量而不是使用 `match` 之外的同名变量。新变量意味着不能够测试外部变量的值。示例 19-27 展示了如何使用匹配守卫修复这个问题。
<span class="filename">文件名src/main.rs</span> <span class="filename">文件名src/main.rs</span>
@ -305,11 +305,11 @@ Rust 不可能决定在元组中匹配 `second` 值之前应该忽略多少个
<span class="caption">示例 19-27: 使用匹配守卫来测试与外部变量的相等性</span> <span class="caption">示例 19-27: 使用匹配守卫来测试与外部变量的相等性</span>
现在这会打印出 `Default case, x = Some(5)`。现在第二个匹配分支中的模式不会引入一个覆盖外部 `y` 的新变量 `y`,这意味着可以在匹配守卫中使用外部的 `y`。相比指定会覆盖外部 `y` 的模式 `Some(y)`,这里指定为 `Some(n)`。此新建的变量 `n` 并没有覆盖任何值,因为 `match` 外部没有变量 `n` 现在这会打印出 `Default case, x = Some(5)`。现在第二个匹配分支中的模式不会引入一个遮蔽外部 `y` 的新变量 `y`,这意味着可以在匹配守卫中使用外部的 `y`。相比指定会遮蔽外部 `y` 的模式 `Some(y)`,这里指定为 `Some(n)`。此新建的变量 `n` 并没有覆盖任何值,因为 `match` 外部没有变量 `n`
匹配守卫 `if n == y` 并不是一个模式所以没有引入新变量。这个 `y` **正是** 外部的 `y` 而不是新的覆盖变量 `y`,这样就可以通过比较 `n``y` 来表达寻找一个与外部 `y` 相同的值的概念了。 匹配守卫 `if n == y` 并不是一个模式所以没有引入新变量。这个 `y` **正是**外部的 `y` 而不是新的遮蔽变量 `y`,这样就可以通过比较 `n``y` 来表达寻找一个与外部 `y` 相同的值了。
也可以在匹配守卫中使用 **或** 运算符 `|` 来指定多个模式,同时匹配守卫的条件会作用于所有的模式。示例 19-28 展示了结合匹配守卫与使用了 `|` 的模式的优先级。这个例子中重要的部分是匹配守卫 `if y` 作用于 `4`、`5` **和** `6`,即使这看起来好像 `if y` 只作用于 `6` 也可以在匹配守卫中使用**或**运算符 `|` 来指定多个模式,同时匹配守卫的条件会作用于所有的模式。示例 19-28 展示了结合匹配守卫与使用了 `|` 的模式的优先级。这个例子中重要的部分是匹配守卫 `if y` 作用于 `4`、`5` **和** `6`,即使这看起来好像 `if y` 只作用于 `6`
```rust ```rust
{{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-28/src/main.rs:here}} {{#rustdoc_include ../listings/ch19-patterns-and-matching/listing-19-28/src/main.rs:here}}
@ -317,7 +317,7 @@ Rust 不可能决定在元组中匹配 `second` 值之前应该忽略多少个
<span class="caption">示例 19-28: 结合多个模式与匹配守卫</span> <span class="caption">示例 19-28: 结合多个模式与匹配守卫</span>
这个匹配条件表明此分支值匹配 `x` 值为 `4`、`5` 或 `6` **同时** `y``true` 的情况。运行这段代码时会发生的是第一个分支的模式因 `x``4` 而匹配,不过匹配守卫 `if y`,所以第一个分支不会被选择。代码移动到第二个分支,这会匹配,此程序会打印出 `no`。这是因为 `if` 条件作用于整个 `4 | 5 | 6` 模式,而不仅是最后的值 `6`。换句话说,匹配守卫与模式的优先级关系看起来像这样: 这个匹配条件表明此分支值匹配 `x` 值为 `4`、`5` 或 `6` **同时** `y``true` 的情况。运行这段代码时会发生的是第一个分支的模式因 `x``4` 而匹配,不过匹配守卫 `if y` `false`,所以第一个分支不会被选择。代码移动到第二个分支,这会匹配,此程序会打印出 `no`。这是因为 `if` 条件作用于整个 `4 | 5 | 6` 模式,而不仅是最后的值 `6`。换句话说,匹配守卫与模式的优先级关系看起来像这样:
```text ```text
(4 | 5 | 6) if y => ... (4 | 5 | 6) if y => ...
@ -329,7 +329,7 @@ Rust 不可能决定在元组中匹配 `second` 值之前应该忽略多少个
4 | 5 | (6 if y) => ... 4 | 5 | (6 if y) => ...
``` ```
可以通过运行代码时的情况看出这一点:如果匹配守卫只作用于由 `|` 运算符指定的值列表的最后一个值,这个分支就会匹配且程序会打印出 `yes` 运行代码后,优先级行为就很明显了:如果匹配守卫只作用于由 `|` 运算符指定的值列表的最后一个值,这个分支就会匹配且程序会打印出 `yes`
### `@` 绑定 ### `@` 绑定
@ -345,7 +345,7 @@ _at_ 运算符(`@`)允许我们在创建一个存放值的变量的同时测
第二个分支只在模式中指定了一个范围,分支相关代码没有一个包含 `id` 字段实际值的变量。`id` 字段的值可以是 10、11 或 12不过这个模式的代码并不知情也不能使用 `id` 字段中的值,因为没有将 `id` 值保存进一个变量。 第二个分支只在模式中指定了一个范围,分支相关代码没有一个包含 `id` 字段实际值的变量。`id` 字段的值可以是 10、11 或 12不过这个模式的代码并不知情也不能使用 `id` 字段中的值,因为没有将 `id` 值保存进一个变量。
最后一个分支指定了一个没有范围的变量,此时确实拥有可以用于分支代码的变量 `id`因为这里使用了结构体字段简写语法。不过此分支中没有像头两个分支那样对 `id` 字段的值进行测试:任何值都会匹配此分支 最后一个分支指定了一个没有范围的变量,此时确实拥有可以用于分支代码的变量 `id`因为这里使用了结构体字段简写语法。不过此分支中没有像头两个分支那样对 `id` 字段的值进行测试:任何值都会匹配该模式
使用 `@` 可以在一个模式中同时测试和保存变量值。 使用 `@` 可以在一个模式中同时测试和保存变量值。

@ -1,8 +1,7 @@
# 高级特性 # 高级特性
> [ch20-00-advanced-features.md](https://github.com/rust-lang/book/blob/main/src/ch20-00-advanced-features.md) <!-- https://github.com/rust-lang/book/blob/main/src/ch20-00-advanced-features.md -->
> <br> <!-- commit 3a30e4c1fbe641afc066b3af9eb01dcdf5ed8b24 -->
> commit 3a30e4c1fbe641afc066b3af9eb01dcdf5ed8b24
现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十一章开始另一个新项目之前,我们先来了解一些你偶尔可能会遇到,但并不会每天都用的语言特性。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下非常有用。虽然很少会碰到它们,我们希望确保你了解 Rust 提供的所有功能。 现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十一章开始另一个新项目之前,我们先来了解一些你偶尔可能会遇到,但并不会每天都用的语言特性。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下非常有用。虽然很少会碰到它们,我们希望确保你了解 Rust 提供的所有功能。

Loading…
Cancel
Save