From 9b767a8ba6defc423368ac1970d7a65a16420aec Mon Sep 17 00:00:00 2001 From: Au Date: Thu, 30 Mar 2023 21:02:51 +0800 Subject: [PATCH] Update match-if-let.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这里表述有些出入, 使用更合适的理解方式, 避免产生误解 --- src/basic/match-pattern/match-if-let.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/basic/match-pattern/match-if-let.md b/src/basic/match-pattern/match-if-let.md index 3f30909a..18dcdced 100644 --- a/src/basic/match-pattern/match-if-let.md +++ b/src/basic/match-pattern/match-if-let.md @@ -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); +} +``` ## 课后练习