Rust match 表达式

简介

在 Rust 中,match 是一种控制流运算符,它通过将一个值与一系列的模式进行比较来工作。这使得 match 非常强大且灵活,可以用于许多场景,包括但不限于条件语句和枚举。

基本语法

一个基本的 match 表达式有两个主要部分:首先是一个待匹配的值,然后是一系列的分支(arms),每个分支都包含一个模式和对应的代码块。语法如下所示:

match value {
    pattern1 => expression1,
    pattern2 => expression2,
    ...
}

value 与某个分支的 pattern 匹配时,就会执行对应的 expression

匹配字面量

你可以使用 match 来匹配字面量:

let x = 1;

match x {
    1 => println!("one"),
    2 => println!("two"),
    _ => println!("other"),
}

在这个例子中,由于 x 的值是 1,所以会打印出 "one"。

匹配枚举类型

match 表达式可以用来解构枚举类型:

enum Color {
    Red,
    Green,
    Blue,
}

let color = Color::Blue;

match color {
    Color::Red => println!("red"),
    Color::Green => println!("green"),
    Color::Blue => println!("blue"),
}

在这个例子中,由于 color 的值是 Color::Blue,所以会打印出 "blue"。

匹配元组和数组切片

你也可以使用 match 来解构元组和数组切片:

let pair = (0, -2);

match pair {
    (0, y) => println!("x is 0 and y is {}", y),
    (x, 0) => println!("y is 0 and x is {}", x),
    _      => println!("No zero was found"),
}

在这个例子中,会打印出 "y is 0 and x is 0"。

匹配结构体

你可以使用 match 来解构结构体:

struct Point {
    x: i32,
    y: i32,
}

let p = Point { x: 0, y: 7 };

match p {
    Point { x, y: 0 } => println!("On the x axis at {}", x),
    Point { x: 0, y } => println!("On the y axis at {}", y),
    Point { x, y }    => println!("On neither axis: ({}, {})", x, y),
}

在这个例子中,会打印出 "On the x axis at 0"。

匹配守卫

你可以使用匹配守卫来增加额外的条件:

let num = Some(4);

match num {
    Some(x) if x < 5 => println!("less than five: {}", x),
    Some(x) => println!("{}", x),
    None => (),
}

在这个例子中,会打印出 "less than five: 4"。

总结

Rust 的 match 表达式是一种强大的控制流运算符,它允许你将一个值与一系列的模式进行比较,从而执行相应的代码块。这使得 match 非常灵活且适用于多种场景。