Please enable Javascript to view the contents

[Rust 基础知识]模式解构

 ·  ☕ 1 分钟

前言

    模式结构是写 Rust 代码中最常用到的设计。本文主要关注模式解构的相关知识点。

一般形式

模式解构可以用在:

  • let 声明
  • 函数和闭包的参数列表
  • match 表达式
  • if let 表达式
  • while let 表达式
  • for 表达式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
struct T {
    iterm1: i32,
    iterm2: i32,
}

fn test_fn((a, b): (i32, i32)) {
    println!("{} {}", a, b);
}

fn main() {
    let tuple = (1i32, 2i32);
    let (first, second) = tuple;
    let callable = |(a, b): (i32, i32)| {
        println!("{} {}", a, b);
    };
    println!("{} {}", first, second);
    test_fn(tuple);
    callable(tuple);

    let t = T {
        iterm1: 1,
        iterm2: 2,
    };

    let T {
        iterm1: i1,
        iterm2: i2,
    } = t;
    println!("{} {}", i1, i2);

    let T { iterm1: ii1, .. } = t;
    println!("{}", ii1);

    let a = 1i32;

    match a {
        0..=1 => println!("a = 1"),
        _ => println!("default"),
    }

    let b = Some(1);
    if let Some(num) = b {
        println!("num = {}", num)
    }


    let arr = vec![1, 2, 3];
    for (index, val) in arr.iter().enumerate() {
        println!("{} => {}", index, val);
    }
}

match

在使用 match 需要覆盖该类型的所有情况,即使可能只有部分值有合法意义例如:

1
2
3
4
5
6
7
    let t = 1; // 1 2 3 有效
    match t {
        1 => println!(" is 1"),
        2 => println!(" is 2"),
        3 => println!(" is 3"),
        _ => println!(" is default"),
    }

我们只需要 1 2 3 但是也需要利用 _ 囊括所有情况才能通过编译。所以如果只是需要一个分支可以使用 if let。

Guards

在 match 中的判定条件还能继续细分:

1
2
3
4
5
6
7
fn main() {
    let t = 1; // 1 2 3 有效
    match t {
        i if i > 2 => println!(" bigger than 2"),
        _ => println!(" is default"),
    }
}

变量绑定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
fn main() {
    let t = Some(Some(3)); // 1 2 3 有效
    match t {
        Some(r @ Some(1..=3)) => println!("{:?}", r),
        _ => println!(" is default"),
    }

    let mut x: Option<String> = Some("hello".into());
    match &mut x {
        Some(s) => s.push_str("world"),
        None => println!("none"),
    }

    println!("{}", x.unwrap())

    let x = 5i32;
    match x {
        ref r => println!("{}", r),
    }

    let mut y = 6i32;

    match y {
        ref mut r => *r = 5i32,
    }

    println!("{}", y)
}
分享

saberuster
作者
saberuster
一个喜欢编程和折腾的追风少年