|
|
|
@ -79,7 +79,7 @@ match x {
|
|
|
|
|
|
|
|
|
|
如果 `x` 是 1、2、3、4 或 5,第一个分支就会匹配。这相比使用 `|` 运算符表达相同的意思更为方便;相比 `1..=5`,使用 `|` 则不得不指定 `1 | 2 | 3 | 4 | 5`这五个值,而使用`..=`指定序列就简短的多,比如希望匹配比如从 1 到 1000 的数字的时候!
|
|
|
|
|
|
|
|
|
|
通过序列匹配只允许用于数字或字符类型,因为编译器会在编译时检查序列是否为空。字符和数字值是 Rust 仅有的可以判断范围是否为空的类型。
|
|
|
|
|
通过序列匹配只允许用于数字或字符类型,因为编译器会在编译时检查序列是否为空,字符和数字值是 Rust 仅有的可以判断范围是否为空的类型。
|
|
|
|
|
|
|
|
|
|
如下是一个使用字符类型序列的例子:
|
|
|
|
|
|
|
|
|
@ -470,13 +470,13 @@ 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` 成员。
|
|
|
|
|
|
|
|
|
|
因为模式中无法提供类如`if x < 5`的表达能力,所以我们通过匹配守卫的方式来实现。
|
|
|
|
|
|
|
|
|
|
在之前,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 `match` 表达式的模式中新建了一个变量而不是使用 `match` 之外的同名变量。内部变量覆盖了外部变量,意味着不能够使用外部变量的值,下面代码展示了如何使用匹配守卫修复这个问题。
|
|
|
|
|
在之前,我们提到可以使用匹配守卫来解决模式中变量覆盖的问题,那里 `match` 表达式的模式中新建了一个变量而不是使用 `match` 之外的同名变量。内部变量覆盖了外部变量,意味着此时不能够使用外部变量的值,下面代码展示了如何使用匹配守卫修复这个问题。
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
fn main() {
|
|
|
|
|