Merge pull request #1192 from acehinnnqru/patch-1

Update match-if-let.md
pull/1204/merge
Sunface 2 years ago committed by GitHub
commit fdc94cea58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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);
}
```
## 课后练习

Loading…
Cancel
Save