|
|
|
@ -340,9 +340,9 @@ let bar = Some(4);
|
|
|
|
|
assert!(matches!(bar, Some(x) if x > 2));
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 变量覆盖
|
|
|
|
|
## 变量遮蔽
|
|
|
|
|
|
|
|
|
|
无论是 `match` 还是 `if let`,他们都可以在模式匹配时覆盖掉老的值,绑定新的值:
|
|
|
|
|
无论是 `match` 还是 `if let`,这里都是一个新的代码块,而且这里的绑定相当于新变量,如果你使用同名变量,会发生变量遮蔽:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
fn main() {
|
|
|
|
@ -364,7 +364,7 @@ fn main() {
|
|
|
|
|
在匹配后,age是Some(30)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
可以看出在 `if let` 中,`=` 右边 `Some(i32)` 类型的 `age` 被左边 `i32` 类型的新 `age` 覆盖了,该覆盖一直持续到 `if let` 语句块的结束。因此第三个 `println!` 输出的 `age` 依然是 `Some(i32)` 类型。
|
|
|
|
|
可以看出在 `if let` 中,`=` 右边 `Some(i32)` 类型的 `age` 被左边 `i32` 类型的新 `age` 遮蔽了,该遮蔽一直持续到 `if let` 语句块的结束。因此第三个 `println!` 输出的 `age` 依然是 `Some(i32)` 类型。
|
|
|
|
|
|
|
|
|
|
对于 `match` 类型也是如此:
|
|
|
|
|
|
|
|
|
@ -380,7 +380,19 @@ fn main() {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
需要注意的是,**`match` 中的变量覆盖其实不是那么的容易看出**,因此要小心!
|
|
|
|
|
需要注意的是,**`match` 中的变量遮蔽其实不是那么的容易看出**,因此要小心!其实这里最好不要使用同名,避免难以理解,如下。
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let age = Some(30);
|
|
|
|
|
println!("在匹配前,age是{:?}", age);
|
|
|
|
|
match age {
|
|
|
|
|
Some(x) => println!("匹配出来的age是{}", x),
|
|
|
|
|
_ => ()
|
|
|
|
|
}
|
|
|
|
|
println!("在匹配后,age是{:?}", age);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 课后练习
|
|
|
|
|