把这面的rust程序进行详细的讲解
把这面的rust程序进行详细的讲解
fn main() {
let arr: [u16; 2] = [114, 514];
let [x, y] = arr;
assert_eq!(x, 114);
assert_eq!(y, 514);
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, ..]));
}
eeeeeeeeeeeeeeeeeeeeeeeeeee
这个 Rust 代码主要演示了模式匹配(Pattern Matching)在数组([T; N]
)和切片(&[T]
)上的应用。下面我们逐行讲解它的工作方式和关键点。
代码解析
1. 静态数组的解构
fn main() {
let arr: [u16; 2] = [114, 514];
let [x, y] = arr;
arr
是一个固定长度的数组[u16; 2]
,即u16
类型的数组,长度为2
。let [x, y] = arr;
使用模式匹配对数组进行解构,分别赋值给x
和y
:x = 114
y = 514
assert_eq!(x, 114);
assert_eq!(y, 514);
- 这里使用
assert_eq!
宏确保x
和y
的值正确,代码不会 panic。
2. 切片的模式匹配
let arr: &[u16] = &[114, 514];
- 这里
arr
变成了一个切片引用(&[u16]
),而不再是一个固定长度的数组。 - 切片在底层由指针和长度组成,并不存储数据,而是引用了堆或栈上的数据。
模式匹配第一个元素
if let [x, ..] = arr {
assert_eq!(x, &114);
}
if let [x, ..] = arr
用于匹配切片的模式:[x, ..]
代表匹配第一个元素x
,..
表示忽略剩余的所有元素。
- 由于
arr
是一个&[u16]
,所以x
也是&u16
,因此assert_eq!(x, &114)
比较的是两个&u16
。
模式匹配最后一个元素
if let &[.., y] = arr {
assert_eq!(y, 514);
}
[.., y]
代表匹配最后一个元素y
,..
表示忽略前面的所有元素。assert_eq!(y, 514);
说明y
直接是u16
,因为&[.., y]
使得y
自动解引用。
3. 空切片的匹配
let arr: &[u16] = &[];
- 这里
arr
是一个空切片,即&[u16]
长度为0
。
匹配空切片
assert!(matches!(arr, [..]));
matches!(arr, [..])
用于检查arr
是否匹配任意长度的切片(包括空切片)。..
代表“可以匹配任何数量的元素”,所以[]
也可以匹配[..]
,因此assert!(true)
。
匹配非空切片
assert!(!matches!(arr, [x, ..]));
[x, ..]
表示必须至少有一个元素的切片,而arr
是空切片[]
,所以匹配失败,assert!(!true)
。
总结
代码 | 作用 |
---|---|
let [x, y] = arr; |
解构固定长度数组 [u16; 2] |
if let [x, ..] = arr |
匹配切片的第一个元素 |
if let &[.., y] = arr |
匹配切片的最后一个元素 |
matches!(arr, [..]) |
检查是否是任意切片(包括空切片) |
matches!(arr, [x, ..]) |
检查是否至少有一个元素 |
这段代码主要展示了 Rust 模式匹配在数组与切片上的强大功能,对于处理变长数据(如 &[T]
)时非常有用。