diff --git a/src/enums_and_pattern_matching/match_control_flow.md b/src/enums_and_pattern_matching/match_control_flow.md index 102b19f..1aa33b9 100644 --- a/src/enums_and_pattern_matching/match_control_flow.md +++ b/src/enums_and_pattern_matching/match_control_flow.md @@ -215,15 +215,16 @@ error: could not compile `match_demo` (bin "match_demo") due to previous error ``` -Rust 是知道这里未曾覆盖到每种可能情形,并甚至清楚这里忘记了那个模式! Rust 中的 `match` 表达式要是 *彻底的(exhaustive)*:为了让代码有效,就必须穷尽所有的可能性。尤其是在 `Option` 这个示例中,在 Rust 阻止这里忘记显式地处理 `None` 这个情形时,在这里可能会有个 `null` 值时,他就保护了避免有个值的错误假设,进而让那个先前讨论到的十亿美金错误成为不可能了。 +Rust 知道,我们没有涵盖所有可能的情况,甚至知道我们忘记了哪个模式!Rust 中的匹配是 *穷举性的,exhaustive*:我们必须穷举每一种可能,代码才能有效。特别是在 `Option` 的情况下,在 Rust 防止我们忘记显式处理 `None` 情况时,他保护我们在我们可能有着空值时,不会错误假定我们有个值,从而使前面讨论的十亿美元错误,不可能发生。 -## 捕获所有模式与 `_` 占位符 +## 全包模式与 `_` 占位符 **Catch-all Patterns and the `_` Placeholder** -运用枚举,还可以对少数特定值采取特别动作,而对所有其他值采取一种默认动作。设想正在实现某个游戏,其中在投中了骰子上的 3 点时,游戏角色就不会移动,而是会收到一顶新的帽子道具。而在投中 7 点时,游戏角色会失去一定道具帽子。对于其他所有点数值,游戏角色都会在游戏板上移动相应数目的格子。下面就是个实现了该逻辑的 `match` 表达式,其中的骰子点数结果,是硬编码而非随机值,至于其他由不带函数体的函数所表示的逻辑,则是由于实现这些函数超出了本示例的范围: +使用枚举,我们还可以对少数特定值,采取特殊操作,而对所有其他值,采取默认操作。请试想一下,我们在实现某个游戏时,如果掷骰子掷出 3 点,玩家就不会移动,但会得到一顶新的花式帽子。如果掷出的骰子是 7 点,玩家就会失去一顶花式帽子。对于所有其他数值,咱们的玩家都会在游戏棋盘上,移动相应数量的空间。下面是个实现了上述逻辑的 `match` 表达式,其中掷骰子的结果,是硬编码而不是随机值,所有其他逻辑都用没有主体的函数表示,因为具体实现这些函数,不在本例的范围之内: + ```rust let dice_roll = 9; @@ -236,14 +237,15 @@ match dice_roll { fn add_fancy_hat() {} fn remove_fancy_hat() {} -fn move_player() {} +fn move_player(num_spaces: u8) {} ``` -对于前两个支臂,模式为字面值 `3` 和 `7`。而那最后的最比,则涵盖了所有其他可能的值,该模式为这里以选为命名为 `other` 的那个变量。为该 `other` 支臂所运行的代码,通过将这个 `other` 变量传递给 `move_player` 函数,而用到了这个变量。 -由于那最后的模式将匹配到未特别列出的全部值,因此尽管这里并未列出 `u8` 类型变量有的全部可能值,这段代码仍会编译。这种捕获全部的模式,满足了 `match` 表达式务必彻底的要求。请注意由于这些模式是求值的,因此这里必须将那个捕获全部支臂放在最后。若在捕获全部之后,添加了其他支臂,那么 Rust 就会告警,这是由于这些在捕获全部之后的支臂根本不会匹配到! +对于前两个臂,模式均为字面值 `3` 和 `7`。对于涵盖了所有其他可能值的最后支臂,其中的模式为我们选择命名为 `other` 的变量。为这个 `other` 支臂运行的代码,会通过将该变量传递给 `move_player` 函数,而使用该变量。 -Rust 还有一种在不愿使用捕获全部模式中的值时,可使用的一种模式:`_`,这是一种特别的、未与该值绑定的其他所有值。这种模式告诉 Rust 这里将不会使用该值,因此 Rust 就不会发出有关某个未用到变量的告警了(Rust also has a pattern we can use when we don't want to use the value in the catch-all pattern: `_`, which is a special pattern that matches any value and doen't not bind to that value. This tells Rust we aren't going to use the value, so Rust won't warn us about an unused varialbe)。 +即使我们没有列出 `u8` 的所有可能值,这段代码也会编译,因为最后那个模式,将匹配所有未特别列出的值。这种全包模式,满足了 `match` 表达式必须穷举的要求。请注意,我们必须把这个全包支臂放在最后,因为模式是按顺序求值的。如果我们把这个全部支臂放在了前面,其他支臂就不会运行,所以如果我们在全包支臂后,添加了支臂,Rust 就会发出警告! + +Rust 还提供了一种,在我们需要一个全包,但又不想 *使用* 全包模式中的值时,可以使用的模式:`_` 是个特殊的模式,他可以匹配任何值,但不会与该值绑定。这会告诉 Rust,我们不打算使用该值,因此 Rust 不会警告我们,有个未使用的变量。 下面就来将那个游戏的规则修改为,在投中骰子的三点和七点之外别的点数时,就必须再投一次骰子。那么这里就不需要用到那个点数值了,因此就可以将这里的代码修改为使用 `_` 而不是那个名为 `other` 的变量: