|
|
|
@ -470,7 +470,7 @@ 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` 成员。
|
|
|
|
|
|
|
|
|
@ -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` 只作用于 `6`,但实际上匹配守卫 `if y` 作用于 `4`、`5` **和** `6` ,在满足`x`属于 `4 | 5 | 6` 后才会判断 `y` 是否为 `true`:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
let x = 4;
|
|
|
|
@ -511,7 +511,7 @@ match x {
|
|
|
|
|
|
|
|
|
|
这个匹配条件表明此分支只匹配 `x` 值为 `4`、`5` 或 `6` **同时** `y` 为 `true` 的情况。
|
|
|
|
|
|
|
|
|
|
虽然在第一个分支中,`x`匹配了模式`4`,但是对于匹配守卫`if y`来说,因为`y`是`false`,因此该守卫条件的值永远是`false`,也意味着第一个分支永远无法被匹配。
|
|
|
|
|
虽然在第一个分支中,`x` 匹配了模式 `4` ,但是对于匹配守卫 `if y` 来说,因为 `y` 是 `false`,因此该守卫条件的值永远是 `false`,也意味着第一个分支永远无法被匹配。
|
|
|
|
|
|
|
|
|
|
下面的文字图解释了匹配守卫作用于多个模式时的优先级规则,第一张是正确的:
|
|
|
|
|
|
|
|
|
@ -529,7 +529,7 @@ match x {
|
|
|
|
|
|
|
|
|
|
## @绑定
|
|
|
|
|
|
|
|
|
|
`@`(读作at)运算符允许为一个字段绑定另外一个变量。下面例子中,我们希望测试 `Message::Hello` 的 `id` 字段是否位于 `3..=7` 范围内,同时也希望能将其值绑定到 `id_variable` 变量中以便此分支相关联的代码可以使用它。可以将 `id_variable` 命名为 `id`,与字段同名,不过出于示例的目的这里选择了不同的名称。
|
|
|
|
|
`@`(读作at)运算符允许为一个字段绑定另外一个变量。下面例子中,我们希望测试 `Message::Hello` 的 `id` 字段是否位于 `3..=7` 范围内,同时也希望能将其值绑定到 `id_variable` 变量中以便此分支中相关的代码可以使用它。我们可以将 `id_variable` 命名为 `id`,与字段同名,不过出于示例的目的这里选择了不同的名称。
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
enum Message {
|
|
|
|
@ -553,7 +553,7 @@ match msg {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
上例会打印出 `Found an id in range: 5`。通过在 `3..=7` 之前指定 `id_variable @`,我们捕获了任何匹配此范围的值并同时将改值绑定到变量`id_variable`上。
|
|
|
|
|
上例会打印出 `Found an id in range: 5`。通过在 `3..=7` 之前指定 `id_variable @`,我们捕获了任何匹配此范围的值并同时将该值绑定到变量`id_variable`上。
|
|
|
|
|
|
|
|
|
|
第二个分支只在模式中指定了一个范围,`id` 字段的值可以是 `10、11 或 12`,不过这个模式的代码并不知情也不能使用 `id` 字段中的值,因为没有将 `id` 值保存进一个变量。
|
|
|
|
|
|
|
|
|
|