模式匹配
- match匹配
功能类似于C++、Python中的switch case语句。
结合例子来介绍,enum Direction {East,West,South,North,}#[derive(Debug)]enum UsState {Alabama,Alaska,}enum Coin {Penny,Nickel,Dime,Quarter(UsState), // 25美分硬币}#[derive(Debug)]enum MyEnum {Foo,Bar}fn main() {let drc = Direction::East;// match返回变量,用以赋值alet a = match drc {Direction::East => { println!("Go to east!");"East"},_ => { println!("Not Go to west!");"Not East"},};println!("{}",a);// 枚举可以包含变量let alaska_coin = Coin::Quarter(UsState::Alaska);//alaska_coin匹配了第一个分支,state因此获得枚举包含的变量"UsState::Alaska"let money = match alaska_coin{Coin::Quarter(state)=>{println!("Alaska coin!");0.25},Coin::Penny=>0.1,Coin::Nickel=>0.5,Coin::Dime=>0.1,};println!("{}",money);}
- matches宏
把表达式与模式匹配,返回true或false。
下例,使用matches宏过滤列表:let mut v = vec![MyEnum::Foo,MyEnum::Bar,MyEnum::Foo]; let vv = v.iter().filter(|x| matches!(x, MyEnum::Bar));
- if let
rust禁止if语句单分支而无else分支;用if let来处置单模式。let v = Some(3u8);if let Some(3) = v {println!("three");}
- 变量遮蔽问题
模式匹配是一个新代码块,其中绑定的变量、同名变量会遮蔽已有的变量。fn main() {let age = Some(30);println!("在匹配前,age是{:?}",age);if let Some(age) = age {println!("匹配出来的age是{}",age);} println!("在匹配后,age是{:?}",age); }