上QQ阅读APP看书,第一时间看更新
3.4 if let和while let模式匹配
Rust提供了if let和while let模式匹配,在某些场景中可替代match模式匹配来简化代码。
代码清单3-6中,match_value函数仅要求对Some(7)进行匹配操作,并不要求处理其他情况,但是为了满足match模式穷尽匹配的要求,必须在处理Some(7)分支后加上“=> ()”分支。if_let_value函数使用if let简化了这一处理逻辑。if let后紧跟的表达式中,左侧为匹配模式,右侧为要匹配的值,两者通过等号分隔开。这里左侧的匹配模式对应match的一个分支,可以将if let视为match的语法糖,仅当匹配某一模式时执行代码,并忽略其他所有模式。
代码清单3-6 if let
1 fn match_value(value: Option<i32>) { 2 match value { 3 Some(7) => println!("seven"), 4 _ => (), 5 } 6 } 7 8 fn if_let_value(value: Option<i32>) { 9 if let Some(7) = value { 10 println!("seven"); 11 } 12 }
代码清单3-7中,match_vec函数通过loop循环遍历动态数组vec,将元素依次取出并打印。pop方法返回Option类型,因此使用match模式匹配,Some(value)匹配vec中的元素,None匹配vec被取空的情况。while_let_vec函数使用while let简化了这一处理逻辑。while let后紧跟的表达式中,左侧为匹配模式,右侧为要匹配的值,两者通过等号分隔开。当vec中的元素被取空时,while循环会自动退出。
代码清单3-7 while let
1 fn match_vec() { 2 let mut vec = vec![1, 2, 3, 4, 5]; 3 loop { 4 match vec.pop() { 5 Some(value) => println!("{}", value), 6 None => break, 7 } 8 } 9 } 10 11 fn while_let_vec() { 12 let mut vec = vec![1, 2, 3, 4, 5]; 13 while let Some(value) = vec.pop() { 14 println!("{}", value); 15 } 16 }