Rust编程:入门、实战与进阶
上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  }