模式是Rust中的特殊语法,用于匹配复杂和简单类型的结构
介绍
使用场景:将模式与匹配表达式和其他构造结合使用,能更好的控制程序的控制流
模式由以下元素或组合组成:
- 字面值
- 变量
- 通配符
- 占位符
- 解构的数据、enum、struct和tuple,以 struct 为例
struct Point {
x: i32,
y: i32,
}
fn abc() {
let p = Point{ x: 0, y: 7};
let Point { x: a, y: b} = p; // let Point{ x, y } = p;
assert_eq!(0, a);
assert_eq!(7, b);
match p {
Point { x, y: 0} => ...,
}
}
辩驳性
模式由两种形式:
可辩驳模式
:对于某些值,无法进行匹配的模式,如 if let Some(x) = a_value { }
如果 a_value = None
无可辩驳模式
:能匹配任何可能传递的值的模式,如 let x = 5;
使用场景:
- 函数参数、let语句、for循环只接受
无可辩驳的模式
- if let 和 while let 可接受
可辩驳
和 无可辩驳
的模式
match 的 arm
match value {
Pattern1 => Expression1,
Pattern2 => Expression2,
Pattern3 | Pattern4 => Expression3, // 匹配 Pattern3 or Pattern4
1..5 => Expression4, // 匹配 1,2,3,4
_ => (),
}
说明:
let num = Some(8);
match num {
Some(x) if x < 6 => ...,
}
条件 if let 表达式
if let
表达式主要是作为一种简短的方式来等价的代替只有一个匹配项的 match
,但不会检查穷尽性
if let
可选的可以是
while let 条件循环
只要模式继续满足匹配的条件,那么 while 循环一直运行
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
while let Some(i) = stack.pop(){
println!("{}", i); // 2 1
}
for 循环
for 循环中,模式就是 for 关键字后的值
let mut a = vec!['a', 'b', 'c'];
for (i, v) in a.iter().enumerate() {
println!("{} {}", i, v);
}
let 语句
let 语句也是模式
let Pattern1 = Expression1;
let a = 8;
let (x, y, z) = (1, 2, 3);
函数的参数
函数的参数也是模式
fn foo(x: i32) {
// some code
}
@绑定
@绑定
符合可以创建一个变量,该变量可以在测试某个值是否与模式匹配的同时保存该值
enum Message {
Hello { id: i32 },
}
fn main() {
let msg = Message::Hello{ id: 5};
match msg {
Message::Hello {
id: id_var @ 3..=7,
} => {
...
}
Message::Hello {
id: 1..=2,
} => {
...
}
Message::Hello { id } => {
...
}
_ => ()
}
}