diff --git a/src/basic/match-pattern/match-if-let.md b/src/basic/match-pattern/match-if-let.md index 842080ef..69787f94 100644 --- a/src/basic/match-pattern/match-if-let.md +++ b/src/basic/match-pattern/match-if-let.md @@ -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); +} +``` ## 课后练习