模式匹配是Rust语言中一个非常核心的特性,它允许你将值与一系列模式进行比较,并根据模式来执行不同的代码块。Rust中的模式匹配通常与 match
表达式一起使用。
match
表达式
match
表达式是Rust中最常见的模式匹配形式。它将一个值与一系列的模式进行比较,并为每个模式执行相应的代码块。match
表达式的一般形式如下:
match value {
pattern1 => expression1,
pattern2 => expression2,
// ...
_ => default_expression,
}
-
value
是要匹配的值。 -
pattern1
,pattern2
, ... 是要与之比较的模式。 -
expression1
,expression2
, ... 是当模式匹配时执行的表达式。 -
_
是一个特殊的模式,它匹配任何值。它类似于其他语言中
switch语句的
default` 分支。
在Rust中,基础类型的模式匹配通常涉及字面量模式、变量模式和通配符模式。
字面量模式
字面量模式直接匹配一个具体的值。
fn main() {
let number = 42;
match number {
1 => println!("One"),
42 => println!("The answer to life, the universe, and everything"),
_ => println!("Some other number"),
}
}
在这个例子中,match
表达式会检查 number
变量是否等于 1
或 42
。如果都不匹配,则执行通配符模式 _
对应的分支。
变量模式
变量模式将匹配的值绑定到一个变量。
fn main() {
let number = 7;
match number {
x => println!("The number is {}", x),
}
}
这里,无论 number
的值是什么,都会匹配到变量模式 x
,并将其绑定到 number
的值。然后打印出来。
通配符模式
通配符模式 _
匹配任何值,通常用于忽略不关心的值。
fn main() {
let number = 7;
match number {
_ => println!("I don't care about the number"),
}
}
在这个例子中,无论 number
的值是什么,都会匹配到通配符模式,并执行相应的分支。
范围模式
范围模式(range pattern)是模式匹配中的一种特殊类型,它允许你匹配一个落在特定范围内的值。
范围模式通常用于匹配整数或字符类型的值。当你想要根据一个值是否在某个连续的范围内来执行不同的逻辑时,范围模式特别有用。
这里有一个简单的例子,展示了如何使用范围模式来匹配一个整数值:
fn main() {
let num = 5;
match num {
1..=5 => println!("The number is between 1 and 5"),
_ => println!("The number is outside the range"),
}
}
在这个例子中,如果num
的值在1到5之间(包括1和5),则第一个模式1..=5
会匹配,并打印出相应的信息。如果num
的值不在这个范围内,则会匹配到_
模式,这是一个通配符模式,它匹配任何值。
范围模式也可以用于if let
语句,使得代码更加简洁:
fn main() {
let num = 3;
if let 1..=5 = num {
println!("The number is between 1 and 5");
} else {
println!("The number is outside the range");
}
}
在这个例子中,如果num
的值在1到5之间,则if let
语句的条件为真,并执行第一个分支的代码。
结合使用
你也可以在 match
表达式中结合使用这些模式。
fn main() {
let number = 10;
match number {
1 => println!("One"),
2 | 3 | 5 | 7 => println!("This is a prime"),
10..=20 => println!("Between 10 and 20"),
_ => println!("Some other number"),
}
}
在这个例子中,我们使用了字面量模式、或模式(|
运算符)和范围模式(..=
)。如果 number
是 10
到 20
之间的任何数,包括 10
和 20
,它会匹配第三个分支。
通过这些基础类型的模式匹配,你可以看到Rust中的 match
表达式是多么的灵活和强大。即使是在处理简单的值时,它也能提供清晰和表达力强的代码。
练习题
将if-else练习题改成match实现。