【图书介绍】《Rust编程与项目实战》-****博客
《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)
Rust编程与项目实战_夏天又到了的博客-****博客
学过C语言的同学或许在等switch,明确告诉你们,Rust没有switch,而是提供了功能更加强大的匹配控制语句match。它使我们可以将值与一系列模式进行比较,然后根据匹配的模式执行代码。模式可以由文字值、变量名、通配符和其他内容组成。
match语句是Rust中的一种控制流语句,它可以让我们根据不同的模式匹配执行不同的代码。match语句的基本语法如下:
match value {
pattern1 => {
// code1
}
pattern2 => {
// code2
}
_ => {
// 没有任何匹配
}
}
其中,value是要匹配的变量,pattern是匹配模式,=>后面是要执行的代码块。如果value匹配了某个模式,就会执行对应的代码块。如果value没有匹配任何模式,就会执行默认的代码块(即_ => {…})。
接下来,我们将通过一些示例来介绍match语句的基础用法。
5.2.1 匹配整数
匹配整数就是让待匹配的值和不同的整数比较,代码如下:
fn main() {
let x = 1;
match x {
1 => println!("x is one"),
2 => println!("x is two"),
_ => println!("x is not one or two"),
}
}
在这个示例中,我们定义了一个整数变量x,并使用match语句匹配它。如果x等于1,就会执行第一个代码块,输出"x is one";如果x等于2,就会执行第二个代码块,输出"x is two";如果x不等于1或2,就会执行默认的代码块,输出"x is not one or two"。最终输出结果:x is one。
这个例子是匹配单个值,我们还可以匹配多个值,如果想匹配多个值,不同的值之间用“|”隔开,比如:
fn main() {
let number = 7;
match number {
// 匹配多个值
2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
// 要覆盖所有的可能分支,不然有编译错误
_ => println!("Ain't special"),
}
}
结果输出:This is a prime。
5.2.2 匹配枚举类型
枚举是一个数据结构,里面可以包含不同的成员元素。匹配枚举就是让待匹配的值和一个枚举中的不同元素进行比较。枚举我们暂时还没学到,这里暂时不用太深究,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。可以认为,枚举是一个有名称的整型常数的集合。
match匹配枚举的代码如下:
enum Color {
Red,
Green,
Blue,
}
let color = Color::Green;
match color {
Color::Red => println!("The color is red"),
Color::Green => println!("The color is green"),
Color::Blue => println!("The color is blue"),
}
在这个示例中,我们定义了一个枚举类型Color,并将变量color赋值为Color::Green。然后,使用match语句匹配color。如果color等于Color::Red,就会执行第一个代码块,输出"The color is red";如果color等于Color::Green,就会执行第二个代码块,输出"The color is green";如果color等于Color::Blue,就会执行第三个代码块,输出"The color is blue"。
5.2.3 匹配元组
元组可以将其他不同类型的多个值组合进一个复合类型中。元组还拥有一个固定的长度:你无法在声明结束后增加或减少其中的元素数量。通常使用逗号分隔后放置到一对圆括号中创建一个元组。元组每个位置的值都有一个类型,这些类型不需要是相同的。比如我们定义一个元组:
let tuple:(i32,f64,u8) = (-325,4.9,22);
也可以省略类型,比如:
let point = (1, 2);
匹配元组的代码如下:
let point = (1, 2);
match point {
(0, 0) => println!("The point is at the origin"),
(_, 0) => println!("The point is on the x-axis"),
(0, _) => println!("The point is on the y-axis"),
(x, y) => println!("The point is at ({}, {})", x, y),
}
在这个示例中,我们定义了一个元组变量point,并使用match语句匹配它。如果point等于(0, 0),就会执行第一个代码块,输出"The point is at the origin";如果point的第二个元素等于0,就会执行第二个代码块,输出"The point is on the x-axis";如果point的第一个元素等于0,就会执行第三个代码块,输出"The point is on the y-axis";否则执行第四个代码块,输出"The point is at ({}, {})"。
5.2.4 匹配范围
匹配范围和匹配多个值有点类似,但匹配多个值可能是不连续的,而匹配范围则是一段连续的值区间。匹配范围的示例代码如下:
let age = 20;
match age {
0..=17 => println!("You are a minor"),
18..=64 => println!("You are an adult"),
_ => println!("You are a senior"),
}
在这个示例中,我们定义了一个整数变量age,并使用match语句匹配它。如果age的取值范围为0~17,就会执行第一个代码块,输出"You are a minor";如果age的取值范围为18~64,就会执行第二个代码块,输出"You are an adult";否则执行默认的代码块,输出"You are a senior"。
5.2.5 匹配守卫
匹配守卫(Match Guard)是一个位于 match 分支模式之后的额外 if 条件,它能为分支模式提供进一步的匹配条件。示例代码如下:
let x = 5;
match x {
n if n < 0 => println!("The value is negative"),
n if n > 10 => println!("The value is greater than 10"),
_ => println!("The value is between 0 and 10"),
}
在这个示例中,我们定义了一个整数变量 x,并使用 match 语句匹配它。在模式中,我们使用 if 语句添加了一个守卫条件。如果 x 小于 0,就会执行第一个代码块,输出"The value is negative";如果 x 大于 10,就会执行第二个代码块,输出"The value is greater than 10";否则执行默认的代码块,输出"The value is between 0 and 10"。
5.2.6 一些经验
在实际开发中,我们经常需要使用 match 语句来处理复杂的逻辑。以下是一些实践经验,可以帮助我们更好地使用match语句。
经验1:给每个分支加上花括号
在match语句中,每个分支的代码块通常都比较复杂,因此我们应该给每个分支加上花括号,以便更好地阅读和维护代码。例如:
fn main() {
let x = 1;
match x {
1 => {
println!("The value is one");
println!("This is a long message");
}
2 => {
println!("The value is two");
}
_ => {
println!("The value is not one or two");
}
}
}
输出结果如下:
The value is one
This is a long message
经验2:使用_忽略不需要的变量
在match语句中,我们可以使用_符号来忽略不需要的变量。这样可以简化代码,并且让代码更加清晰。例如:
let x = (1, 2);
match x {
(1, _) => println!("The first element is 1"),
(_, 2) => println!("The second element is 2"),
_ => (),
}
在这个示例中,使用_符号来忽略第二个元素,因为我们只关心第一个元素是否等于1。
经验3:使用if let简化模式匹配
在某些情况下,我们只需要匹配一个模式,而不需要处理其他模式。此时,可以使用if let语句来简化模式匹配的代码。例如:
let x = Some(5);
if let Some(n) = x {
println!("The value is {}", n);
}
在这个示例中,我们只需要匹配Some类型的值,而不需要处理None类型的值。因此,使用if let语句可以让代码更加简洁和清晰。
match语句是Rust中非常强大的语言特性,它可以让我们根据不同的匹配模式执行不同的代码。在本教程中,我们介绍了 match 语句的基础用法、进阶用法和实践经验等方面的内容。通过学习本教程,相信读者可以掌握match语句的基本用法,并能够在实际开发中灵活运用它。