Rust match 表达式
最后修改于 2025 年 2 月 19 日
在本文中,我们将展示如何在 Rust 中使用 match 表达式。
Match 表达式
Rust 中的 match 表达式是一个强大的控制流运算符,它允许您将一个值与一系列模式进行比较,并根据匹配的模式执行代码。它类似于其他语言中的 switch 语句,但功能更强大、更灵活。
match 表达式的语法如下:
match value {
pattern1 => expression1,
pattern2 => expression2,
...
_ => default_expression,
}
match 表达式按顺序检查 value 与每个模式的匹配情况。如果模式匹配,则执行相应的表达式。下划线 _ 是一个捕获所有模式,它匹配任何值,类似于 switch 语句中的 default 情况。
简单示例
以下是一个使用 match 表达式的简单 Rust 示例。
fn main() {
let number = 3;
match number {
1 => println!("One"),
2 => println!("Two"),
3 => println!("Three"),
_ => println!("Other"),
}
}
该程序定义了一个变量 number,并使用 match 表达式检查其值。
match number {
1 => println!("One"),
2 => println!("Two"),
3 => println!("Three"),
_ => println!("Other"),
}
match 表达式将 number 的值与每个模式进行比较。如果值与模式匹配,则执行相应的代码块。下划线 _ 用作默认情况。
$ cargo run -q Three
Match guards (匹配守卫)
match 分支中的 if 条件称为匹配守卫。它们允许通过为模式添加额外的条件检查来实现更复杂的匹配。
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
let r = rng.gen_range(-5..=5);
match r {
x if x > 0 => println!("The number {} is positive", x),
0 => println!("The number is zero"),
_ => println!("The number {} is negative", r),
}
}
我们使用一个随机数生成器在 -5 到 5 的范围内生成一个随机数 r。
x if x > 0 => println!("The number {} is positive", x),
此分支匹配 r 大于 0 的任何值。匹配守卫 if x > 0 确保此分支仅在 r 为正数时执行。变量 x 被绑定到 r 的值并打印出来。
0 => println!("The number is zero"),
此分支匹配特定值 0,并打印一条消息,表明该数字为零。
_ => println!("The number {} is negative", r),
此分支匹配所有其他值(即不满足先前条件的值)。下划线 _ 是一个捕获所有模式,它打印一条消息,表明该数字为负数,并使用 r 的值。
分支中的多个选项
我们可以使用 | 将多个选项组合起来。
fn main() {
let grades = vec!["A", "B", "C", "D", "E", "F", "FX"];
for grade in grades {
match grade {
"A" | "B" | "C" | "D" | "E" | "F" => println!("passed"),
"FX" => println!("failed"),
_ => println!("invalid"),
}
}
}
使用 | 运算符,我们将 A 到 F 的分数组合到一个分支中。
$ cargo run -q passed passed passed passed passed passed failed
使用枚举进行匹配
match 表达式经常与 Rust 中的枚举一起使用。枚举允许您通过列举其可能的变体来定义一个类型。
enum Direction {
Up,
Down,
Left,
Right,
}
fn main() {
let direction = Direction::Up;
match direction {
Direction::Up => println!("Going up!"),
Direction::Down => println!("Going down!"),
Direction::Left => println!("Going left!"),
Direction::Right => println!("Going right!"),
}
}
在此示例中,我们定义了一个带有四个变体的 Direction 枚举。然后,我们使用 match 表达式来处理每个变体。
match direction {
Direction::Up => println!("Going up!"),
Direction::Down => println!("Going down!"),
Direction::Left => println!("Going left!"),
Direction::Right => println!("Going right!"),
}
match 表达式检查 direction 的值,并根据变体执行相应的代码块。
$ cargo run -q Going up!
使用 Option 进行匹配
Rust 中的 Option 类型用于表示可能包含一个值(Some)或不包含值(None)的值。match 表达式通常用于处理 Option 类型。
fn main() {
let some_value = Some(5);
match some_value {
Some(value) => println!("Got a value: {}", value),
None => println!("Got nothing"),
}
}
在此示例中,我们使用 match 表达式来处理 Option 类型。
match some_value {
Some(value) => println!("Got a value: {}", value),
None => println!("Got nothing"),
}
match 表达式检查 some_value 是 Some 还是 None,并执行相应的代码块。
$ cargo run -q Got a value: 5
使用 Result 进行匹配
Rust 中的 Result 类型用于错误处理。它可以是 Ok(包含一个值)或 Err(包含一个错误)。match 表达式通常用于处理 Result 类型。
fn main() {
let result: Result<i32, &str> = Ok(10);
match result {
Ok(value) => println!("Success: {}", value),
Err(error) => println!("Error: {}", error),
}
}
在此示例中,我们使用 match 表达式来处理 Result 类型。
match result {
Ok(value) => println!("Success: {}", value),
Err(error) => println!("Error: {}", error),
}
match 表达式检查 result 是 Ok 还是 Err,并执行相应的代码块。
$ cargo run -q Success: 10
使用模式进行匹配
match 表达式还可以与更复杂的模式一起使用,例如范围、元组和结构体。
fn main() {
let pair = (0, -2);
match pair {
(0, y) => println!("First is 0 and y is {}", y),
(x, 0) => println!("x is {} and second is 0", x),
_ => println!("It doesn't matter what they are"),
}
}
在此示例中,我们使用 match 表达式来匹配一个元组。
match pair {
(0, y) => println!("First is 0 and y is {}", y),
(x, 0) => println!("x is {} and second is 0", x),
_ => println!("It doesn't matter what they are"),
}
match 表达式检查元组的值,并根据模式执行相应的代码块。
$ cargo run -q First is 0 and y is -2
在本文中,我们探讨了 Rust 中的 match 表达式。我们已经了解了如何将其用于简单值、枚举、Option、Result 以及更复杂的模式。match 表达式是 Rust 中控制流的强大工具,它允许您以清晰简洁的方式处理不同的情况。
作者
列出 所有 Rust 教程。