Rust 学习笔记(12)-match

match 允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。

上一节我们学习了Option<T>,这一节我们就来学习下,如何处理Option<T>

  • 我们先看一个简单的例子,处理Option<T>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
fn main() {
    let x: i8 = 5;
    let y: Option<i8> = Some(5);

    // 处理`Option`
    let z = match y {
            Some(i) => i,
            None => 0,
    };

    let sum = i + z;
}
  • 示例2: _ 通配符
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
fn main() {
    // _ 通配符
    // Rust 也提供了一个模式用于不想列举出所有可能值的场景。
    // 例如,u8 可以拥有 0 到 255 的有效的值,如果我们只关心 1、3、5 和 7 这几个值,
    // 就并不想必须列出 0、2、4、6、8、9 一直到 255 的值。
    // 所幸我们不必这么做:可以使用特殊的模式 _ 替代:
    let value: u8 = 3;
    match value {
        1 => println!("one"),
        3 => println!("three"),
        5 => println!("five"),
        7 => println!("seven"),
        _ => (),
    };
}
  • 示例3 匹配枚举
 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
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        // 如果想要在分支中运行多行代码,可以使用大括号。
        Coin::Penny => {
            println!("Lucky penny");
            1
        }
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}

fn main() {
    let coin1 = Coin::Penny;
    let penny = value_in_cents(coin1);
    println!("This value of penny is: {}", penny);
}
  • 示例4 匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。

这和示例1中的,匹配Option<T>Some(i) 成员是一样的

 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
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        }
    }
}

fn main() {
    // 匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。
    let coin = Coin::Quarter(UsState::Alaska);
    let quarter = value_in_cents(coin);
    println!("This value of quarter is: {}", quarter);
}

总结一下

  1. _ 通配符可以匹配所有模式
  2. 匹配是穷尽的,也就是说,你必须处理所有的模式
updatedupdated2025-03-012025-03-01