把这面的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; 使用模式匹配对数组进行解构,分别赋值给 xy
    • x = 114
    • y = 514
    assert_eq!(x, 114);
    assert_eq!(y, 514);
  • 这里使用 assert_eq! 宏确保 xy 的值正确,代码不会 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])时非常有用。

posted on 2025-03-14 15:13  及途又八  阅读(16)  评论(0)    收藏  举报

导航