Update match-if-let.md

这里表述有些出入, 使用更合适的理解方式, 避免产生误解
pull/1192/head
Au 2 years ago committed by GitHub
parent 69fd67d18f
commit 9b767a8ba6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -320,9 +320,9 @@ let bar = Some(4);
assert!(matches!(bar, Some(x) if x > 2));
```
## 变量覆盖
## 变量遮蔽
无论是 `match` 还是 `if let`他们都可以在模式匹配时覆盖掉老的值,绑定新的值:
无论是 `match` 还是 `if let`这里都是一个新的代码块,而且这里的绑定相当于新变量,如果你使用同名变量,会发生变量遮蔽:
```rust
fn main() {
@ -344,7 +344,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` 类型也是如此:
@ -360,7 +360,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);
}
```
## 课后练习

Loading…
Cancel
Save