1. 概述
模式匹配是rust的一种特殊语法,用于匹配复杂和简单类型的结构,将模式与匹配表达式和其他结构结合使用,可以更好地控制程序的控制流。
模式由以下元素(的一些组合)组成
- 字面值
- 解析的数组、enum、struct和tuple
- 变量
- 通配符
- 占位符
想要使用模式,需要将其与某个值进行比较,如果模式匹配,就可以在代码中使用这个值的相应部分。下文将介绍rust中使用到模式匹配的地方。
2. match的Arm(分支)
rust
match VALUE {
PATTERN => EXPRESSION,
PATTERN => EXPRESSION,
PATTERN => EXPRESSION,
}
match表达式的要求是详尽,即包含所有的可能性。一个特殊的模式是_
(下划线),它会匹配到任何东西,不会绑定到变量,所以通常用户match的最后一个分支,或者用于忽略某些值。
3. 条件if let表达式
if let
主要是作为一种简短的方式来等价的代替只有一个匹配项的match。 if let
可选可以拥有else
,包括:
else if
else if let
但是if let
不会检查穷尽性。
例如:
rs
fn main() {
let favorite_color: Option<&str> = None; // 定义一个名为favorite_color的变量,其类型为Option<&str>,即字符串的引用(如果有的话)
let is_tuesday = false; // 定义一个名为is_tuesday的变量,其类型为bool,值为false
let age: Result<u8, _> = "34".parse(); // 定义一个名为age的变量,其类型为Result<u8, _>,即u8的结果(解析一个字符串得到一个数字)
if let Some(color) = favorite_color {
// 如果favorite_color是Some(即有值)
println!("Using your favorite color, {}, as the background", color);
} else if is_tuesday {
// 如果is_tuesday为true
println!("Tuesday is green day!");
} else if let Ok(age) = age {
// 如果age解析成功
if age > 30 {
println!("Using purple as the background color");
} else {
println!("Using orange as the background color");
}
} else {
// 其他情况
println!("Using blue as the background color");
}
}
4. while let条件循环
只要模式匹配继续满足匹配的条件,那它允许while循环一直运行。如下示例
rust
fn main() {
let mut stack = Vec::new();
statck.push(1);
statck.push(2);
statck.push(3);
while let Some(top) = stack.pop() {
println("{}", top);
}
}
5. for循环
for循环是rust中最常见的循环,for循环中,模式就是紧随for关键字后的值。
如下示例代码:
rust
fn main() {
let v = vec!['a', 'b', 'c'];
for (index, value) in v.iter().enumerate() {
println("{} is at index {}", value, index);
}
}
6. let语句
let语句也是模式,官方写法为let PATTERN = EXPRESSION;
,如下示例代码
rust
fn main() {
let a = 5;
let (x, y, z) = (1, 2, 3);
let (v, w) = (1,2,3)
}
7. 函数参数
函数参数也是模式,如下示例代码
rust
fn foo(x: i32) {
// code goes here
}
fn print_coordinates(&(x, y): &(i32, i32)) {
println("Current location: ({}, {})", x, y);
}
fn main() {
let point = (3, 5);
print_coordinates(&point);
}