|
|
|
@ -282,7 +282,7 @@ Rust 不可能决定在元组中匹配 `second` 值之前应该忽略多少个
|
|
|
|
|
|
|
|
|
|
**匹配守卫**(_match guard_)是一个指定于 `match` 分支模式之后的额外 `if` 条件,它也必须被满足才能选择此分支。匹配守卫用于表达比单独的模式所能允许的更为复杂的情况。
|
|
|
|
|
|
|
|
|
|
这个条件可以使用模式中创建的变量。示例 18-26 展示了一个 `match`,其中第一个分支有模式 `Some(x)` 还有匹配守卫 `if x % 2 == 5`(当`x`是偶数的时候为真):
|
|
|
|
|
这个条件可以使用模式中创建的变量。示例 18-26 展示了一个 `match`,其中第一个分支有模式 `Some(x)` 还有匹配守卫 `if x % 2 == 5` (当 `x` 是偶数的时候为真):
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
{{#rustdoc_include ../listings/ch18-patterns-and-matching/listing-18-26/src/main.rs:here}}
|
|
|
|
@ -290,9 +290,9 @@ Rust 不可能决定在元组中匹配 `second` 值之前应该忽略多少个
|
|
|
|
|
|
|
|
|
|
<span class="caption">示例 18-26: 在模式中加入匹配守卫</span>
|
|
|
|
|
|
|
|
|
|
上例会打印出 `less than five: 4`。当 `num` 与模式中第一个分支比较时,因为 `Some(4)` 匹配 `Some(x)` 所以可以匹配。接着匹配守卫检查 `x` 值是否小于 `5`,因为 `4` 小于 `5`,所以第一个分支被选择。
|
|
|
|
|
上例会打印出 `The number 4 is even`。当 `num` 与模式中第一个分支比较时,因为 `Some(4)` 匹配 `Some(x)` 所以可以匹配。接着匹配守卫检查 `x` 除以 `2` 的余数是否等于 `0`,因为它等于 `0`,所以第一个分支被选择。
|
|
|
|
|
|
|
|
|
|
相反如果 `num` 为 `Some(10)`,因为 10 不小于 5 所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,这会匹配因为它没有匹配守卫所以会匹配任何 `Some` 成员。
|
|
|
|
|
相反如果 `num` 为 `Some(5)`,因为 `5` 除以 `2` 的余数是 `1` 不等于 `0` 所以第一个分支的匹配守卫为假。接着 Rust 会前往第二个分支,这次匹配因为它没有匹配守卫所以会匹配任何 `Some` 成员。
|
|
|
|
|
|
|
|
|
|
无法在模式中表达类似 `if x % 2 == 0` 的条件,所以通过匹配守卫提供了表达类似逻辑的能力。这种替代表达方式的缺点是,编译器不会尝试为包含匹配守卫的模式检查穷尽性。
|
|
|
|
|
|
|
|
|
|