diff --git a/src/basic/match-pattern/all-patterns.md b/src/basic/match-pattern/all-patterns.md index 78776cf7..7c428825 100644 --- a/src/basic/match-pattern/all-patterns.md +++ b/src/basic/match-pattern/all-patterns.md @@ -97,7 +97,7 @@ Rust 知道 `'c'` 位于第一个模式的序列内,所以会打印出 `early ### 解构并分解值 -也可以使用模式来解构结构体、枚举、元组和引用。 +也可以使用模式来解构结构体、枚举、元组、数组和引用。 #### 解构结构体 @@ -274,6 +274,37 @@ let ((feet, inches), Point {x, y}) = ((3, 10), Point { x: 3, y: -10 }); 这种将复杂类型分解匹配的方式,可以让我们单独得到感兴趣的某个值。 +#### 解构数组 + +对于数组,我们可以用类似元组的方式解构,分为两种情况: + +定长数组 +```rust +let arr: [u16; 2] = [114, 514]; +let [x, y] = arr; + +assert_eq!(x, 114); +assert_eq!(y, 514); +``` + +不定长数组 +```rust +let arr: &[u16] = &[114, 514]; + +if let [x, ..] = arr { + assert_eq!(x, &114); +} + +if let &[.., y] = arr { + assert_eq!(y, 514); +} + +let arr: &[u16] = &[]; + +assert!(matches!(arr, [..])); +assert!(!matches!(arr, [x, ..])); +``` + ### 忽略模式中的值 有时忽略模式中的一些值是很有用的,比如在 `match` 中的最后一个分支使用 `_` 模式匹配所有剩余的值。 你也可以在另一个模式中使用 `_` 模式,使用一个以下划线开始的名称,或者使用 `..` 忽略所剩部分的值。