【图书介绍】《Rust编程与项目实战》-CSDN博客
《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)
Rust编程与项目实战_夏天又到了的博客-CSDN博客
学过C语言的同学或许在等switch,明确告诉你们,Rust没有switch,而是提供了功能更加强大的匹配控制语句match。它使我们可以将值与一系列模式进行比较,然后根据匹配的模式执行代码。模式可以由文字值、变量名、通配符和其他内容组成。
match语句是Rust中的一种控制流语句,它可以让我们根据不同的模式匹配执行不同的代码。match语句的基本语法如下:
match value {pattern1 => {// code1}pattern2 => {// code2}_ => {// 没有任何匹配}
}
其中,value是要匹配的变量,pattern是匹配模式,=>后面是要执行的代码块。如果value匹配了某个模式,就会执行对应的代码块。如果value没有匹配任何模式,就会执行默认的代码块(即_ => {…})。
接下来,我们将通过一些示例来介绍match语句的基础用法。
匹配整数就是让待匹配的值和不同的整数比较,代码如下:
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。
枚举是一个数据结构,里面可以包含不同的成员元素。匹配枚举就是让待匹配的值和一个枚举中的不同元素进行比较。枚举我们暂时还没学到,这里暂时不用太深究,枚举在日常生活中很常见,例如表示星期的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"。
元组可以将其他不同类型的多个值组合进一个复合类型中。元组还拥有一个固定的长度:你无法在声明结束后增加或减少其中的元素数量。通常使用逗号分隔后放置到一对圆括号中创建一个元组。元组每个位置的值都有一个类型,这些类型不需要是相同的。比如我们定义一个元组:
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 ({}, {})"。
匹配范围和匹配多个值有点类似,但匹配多个值可能是不连续的,而匹配范围则是一段连续的值区间。匹配范围的示例代码如下:
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"。
匹配守卫(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"。
在实际开发中,我们经常需要使用 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语句的基本用法,并能够在实际开发中灵活运用它。