|
|
|
@ -470,11 +470,11 @@ match num {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
上例会打印出 `less than five: 4`。当 `num` 与模式中第一个分支匹配时,因为 `Some(4)` 可以与 `Some(x)`匹配 。接着匹配守卫检查 `x` 值是否小于 `5`,因为 `4` 小于 `5`,所以第一个分支被选择。
|
|
|
|
|
这个例子会打印出 `less than five: 4`。当 `num` 与模式中第一个分支匹配时, `Some(4)` 可以与 `Some(x)`匹配,接着匹配守卫检查 `x` 值是否小于 `5`,因为 `4` 小于 `5`,所以第一个分支被选择。
|
|
|
|
|
|
|
|
|
|
相反如果 `num` 为 `Some(10)`,因为 10 不小于 5 所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,这会匹配因为它没有匹配守卫所以会匹配任何 `Some` 成员。
|
|
|
|
|
相反如果 `num` 为 `Some(10)`,因为 10 不小于 5 ,所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,因为这里没有匹配守卫所以会匹配任何 `Some` 成员。
|
|
|
|
|
|
|
|
|
|
因为模式中无法提供类如`if x < 5`的表达能力,所以我们通过匹配守卫的方式来实现。
|
|
|
|
|
模式中无法提供类如`if x < 5`的表达能力,我们可以通过匹配守卫的方式来实现。
|
|
|
|
|
|
|
|
|
|
在之前,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 `match` 表达式的模式中新建了一个变量而不是使用 `match` 之外的同名变量。内部变量覆盖了外部变量,意味着此时不能够使用外部变量的值,下面代码展示了如何使用匹配守卫修复这个问题。
|
|
|
|
|
|
|
|
|
@ -497,7 +497,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
匹配守卫 `if n == y` 并不是一个模式所以没有引入新变量。这个 `y` **正是** 外部的 `y` 而不是新的覆盖变量 `y`,这样就可以通过比较 `n` 和 `y` 来表达寻找一个与外部 `y` 相同的值的概念了。
|
|
|
|
|
|
|
|
|
|
也可以在匹配守卫中使用 **或** 运算符 `|` 来指定多个模式,**同时匹配守卫的条件会作用于所有的模式**。下面代码展示了结合匹配守卫与使用了 `|` 的模式的优先级。这个例子中重要的部分是匹配守卫 `if y` 作用于 `4`、`5` **和** `6`,即使这看起来好像 `if y` 只作用于 `6`:
|
|
|
|
|
也可以在匹配守卫中使用 **或** 运算符 `|` 来指定多个模式,**同时匹配守卫的条件会作用于所有的模式**。下面代码展示了匹配守卫与 `|` 的优先级。这个例子中重要的部分是匹配守卫 `if y` 作用于 `4`、`5` **和** `6`,即使这看起来好像 `if y` 只作用于 `6`:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
let x = 4;
|
|
|
|
|