From 61b707d3bdf1db8e76b17c2bb03fafe291532224 Mon Sep 17 00:00:00 2001 From: zrll_ <46812903+zrll12@users.noreply.github.com> Date: Fri, 6 Sep 2024 22:53:22 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E7=89=88let-els?= =?UTF-8?q?e=E8=AF=AD=E6=B3=95=E4=BB=8B=E7=BB=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/basic/match-pattern/pattern-match.md | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/basic/match-pattern/pattern-match.md b/src/basic/match-pattern/pattern-match.md index 568afa8e..d0c1deb9 100644 --- a/src/basic/match-pattern/pattern-match.md +++ b/src/basic/match-pattern/pattern-match.md @@ -166,3 +166,45 @@ if let Some(x) = some_option_value { ``` 因为 `if let` 允许匹配一种模式,而忽略其余的模式( 可驳模式匹配 )。 + +#### let-else(Rust 1.65 新增) + +使用`let-else`匹配,即可使`let`变为可驳模式。它可以使用`else`分支来处理模式不匹配的情况,但是`else`分支中必须用发散的代码块处理(例如:`break`,`return`,`panic`)。请看下面的代码: + +```rust +use std::str::FromStr; + +fn get_count_item(s: &str) -> (u64, &str) { + let mut it = s.split(' '); + let (Some(count_str), Some(item)) = (it.next(), it.next()) else { + panic!("Can't segment count item pair: '{s}'"); + }; + let Ok(count) = u64::from_str(count_str) else { + panic!("Can't parse integer: '{count_str}'"); + }; + // error: `else` clause of `let...else` does not diverge + // let Ok(count) = u64::from_str(count_str) else { 0 }; + (count, item) +} + +fn main() { + assert_eq!(get_count_item("3 chairs"), (3, "chairs")); +} +``` + +解构出的变量名作用域不同是`let-else`和`match`、`if let`的主要区别: + +```rust +// if let +if let Some(x) = some_option_value { + println!("{}", x); +} + +// let-else +let Some(x) = some_option_value { + println!("{}", x); +} else { return; } +``` + +在上面的例子中,`if let`写法里的`x`只能在`if`语句块当中使用,而`let-else`写法里的`x`则可以在`let`之外使用。 + From 76062ee9522e417c56425d54a88e5e1ac5b4472c Mon Sep 17 00:00:00 2001 From: zrll_ <46812903+zrll12@users.noreply.github.com> Date: Fri, 6 Sep 2024 23:10:00 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BD=BF=E5=8F=A5=E5=AD=90=E6=9B=B4?= =?UTF-8?q?=E5=8A=A0=E9=80=9A=E9=A1=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/basic/match-pattern/pattern-match.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/basic/match-pattern/pattern-match.md b/src/basic/match-pattern/pattern-match.md index d0c1deb9..94b3aef1 100644 --- a/src/basic/match-pattern/pattern-match.md +++ b/src/basic/match-pattern/pattern-match.md @@ -192,7 +192,7 @@ fn main() { } ``` -解构出的变量名作用域不同是`let-else`和`match`、`if let`的主要区别: +与`match`和`if let`相比,`let-else`的一个显著特点在于其解包成功时所创建的变量具有更广的作用域。在`let-else`语句中,成功匹配后的变量不再仅限于特定分支内使用: ```rust // if let @@ -206,5 +206,5 @@ let Some(x) = some_option_value { } else { return; } ``` -在上面的例子中,`if let`写法里的`x`只能在`if`语句块当中使用,而`let-else`写法里的`x`则可以在`let`之外使用。 +在上面的例子中,`if let`写法里的`x`只能在`if`分支内使用,而`let-else`写法里的`x`则可以在`let`之外使用。 From 76e9a8f724ab19aaf4033f3f2f58311256752b7e Mon Sep 17 00:00:00 2001 From: zrll_ <46812903+zrll12@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:03:09 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/basic/match-pattern/pattern-match.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/basic/match-pattern/pattern-match.md b/src/basic/match-pattern/pattern-match.md index 94b3aef1..76da5b78 100644 --- a/src/basic/match-pattern/pattern-match.md +++ b/src/basic/match-pattern/pattern-match.md @@ -201,9 +201,8 @@ if let Some(x) = some_option_value { } // let-else -let Some(x) = some_option_value { - println!("{}", x); -} else { return; } +let Some(x) = some_option_value else { return; } +println!("{}", x); ``` 在上面的例子中,`if let`写法里的`x`只能在`if`分支内使用,而`let-else`写法里的`x`则可以在`let`之外使用。 From 6f8087917fd2d715a3b9449583b7050b1434aace Mon Sep 17 00:00:00 2001 From: zrll_ <46812903+zrll12@users.noreply.github.com> Date: Thu, 19 Sep 2024 20:14:43 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=87=E7=82=B9?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> --- src/basic/match-pattern/pattern-match.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/match-pattern/pattern-match.md b/src/basic/match-pattern/pattern-match.md index 76da5b78..a7a9291d 100644 --- a/src/basic/match-pattern/pattern-match.md +++ b/src/basic/match-pattern/pattern-match.md @@ -169,7 +169,7 @@ if let Some(x) = some_option_value { #### let-else(Rust 1.65 新增) -使用`let-else`匹配,即可使`let`变为可驳模式。它可以使用`else`分支来处理模式不匹配的情况,但是`else`分支中必须用发散的代码块处理(例如:`break`,`return`,`panic`)。请看下面的代码: +使用 `let-else` 匹配,即可使 `let` 变为可驳模式。它可以使用 `else` 分支来处理模式不匹配的情况,但是 `else` 分支中必须用发散的代码块处理(例如:`break`、`return`、`panic`)。请看下面的代码: ```rust use std::str::FromStr; From 222a0cafca651e0d0d4716530be015ddaab3a8b6 Mon Sep 17 00:00:00 2001 From: zrll_ <46812903+zrll12@users.noreply.github.com> Date: Thu, 19 Sep 2024 20:14:59 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=87=E7=82=B9?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> --- src/basic/match-pattern/pattern-match.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/match-pattern/pattern-match.md b/src/basic/match-pattern/pattern-match.md index a7a9291d..f0de6bb9 100644 --- a/src/basic/match-pattern/pattern-match.md +++ b/src/basic/match-pattern/pattern-match.md @@ -205,5 +205,5 @@ let Some(x) = some_option_value else { return; } println!("{}", x); ``` -在上面的例子中,`if let`写法里的`x`只能在`if`分支内使用,而`let-else`写法里的`x`则可以在`let`之外使用。 +在上面的例子中,`if let` 写法里的 `x` 只能在 `if` 分支内使用,而 `let-else` 写法里的 `x` 则可以在 `let` 之外使用。 From 467cbb6a28b71a8623a2ba6c8e1f0c85e9af6897 Mon Sep 17 00:00:00 2001 From: zrll_ <46812903+zrll12@users.noreply.github.com> Date: Thu, 19 Sep 2024 20:15:25 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=87=E7=82=B9?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> --- src/basic/match-pattern/pattern-match.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/match-pattern/pattern-match.md b/src/basic/match-pattern/pattern-match.md index f0de6bb9..a7f6dfa8 100644 --- a/src/basic/match-pattern/pattern-match.md +++ b/src/basic/match-pattern/pattern-match.md @@ -192,7 +192,7 @@ fn main() { } ``` -与`match`和`if let`相比,`let-else`的一个显著特点在于其解包成功时所创建的变量具有更广的作用域。在`let-else`语句中,成功匹配后的变量不再仅限于特定分支内使用: +与 `match` 和 `if let` 相比,`let-else` 的一个显著特点在于其解包成功时所创建的变量具有更广的作用域。在 `let-else` 语句中,成功匹配后的变量不再仅限于特定分支内使用: ```rust // if let