模式匹配
-
match匹配
功能类似于C++、Python中的switch case语句。
结合例子来介绍,rustenum 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返回变量,用以赋值a let 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宏过滤列表:rustlet 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来处置单模式。rustlet v = Some(3u8); if let Some(3) = v { println!("three"); }
-
变量遮蔽问题
模式匹配是一个新代码块,其中绑定的变量、同名变量会遮蔽已有的变量。rustfn main() { let age = Some(30); println!("在匹配前,age是{:?}",age); if let Some(age) = age { println!("匹配出来的age是{}",age); } println!("在匹配后,age是{:?}",age); }