写点什么

5 分钟速读之 Rust 权威指南(三十六)模式匹配

用户头像
码生笔谈
关注
发布于: 21 小时前
5分钟速读之Rust权威指南(三十六)模式匹配

使用模式匹配的场合

前面我们有讲过matchif let语句的用法,但是没有聊到细节部分:实际上match的每个分支和if let后面紧跟的都是模式,模式可以被应用在很多种表达式中,可用于解构数据。

match 分支中的模式

下面是match表达式的语法,没一个分支就是以一个模式开头:


match VALUE {  PATTERN => EXPRESSION,  PATTERN => EXPRESSION,  PATTERN => EXPRESSION,}
复制代码


match表达式必须穷尽(exhaustive)匹配值的所有可能性:


let value: Result<i32, String> = Ok(5);match value { // 报错,必须穷尽所有的可能  Ok(v) => println!("{}", v),}
// 添加Err情况match value { Ok(v) => println!("{}", v), Err(s) => println!("{}", s)}// 5
复制代码

if let 条件表达式中的模式

使用let关键字后面的代码作为模式进行匹配”=“号后面的数据,与 match 不同的是,if let不需要穷尽所有情况,而else if letelse分支是可选的:


let favorite_color: Option<&str> = None;let is_tuesday = false;let age: Result<u8, _> = "34".parse();
if let Some(color) = favorite_color { println!("使用你最喜欢的颜色, {}, 作为背景色", color);} else if is_tuesday { println!("星期二代表绿色!");} else if let Ok(age) = age { if age > 30 { println!("使用紫色作为背景色"); } else { println!("使用橙色作为背景色"); }} else { println!("使用蓝色作为背景色");}// 使用紫色作为背景色
复制代码


匹配成功之后在新的花括号中的才会生效:


if let Ok(a) = age {  if a > 30 { // a可用了    println!("使用紫色作为背景色");  }}// 报错,a不可用if let Ok(a) = age && a > 30 {  // a可用了}
复制代码

while let 条件循环中的模式

类似于if let,当let关键字后面匹配成功后,while将会持续执行,直到匹配失败:


let mut stack = vec![1, 2, 3];// 每次从stack后面取出一个,直到取不到位为止while let Some(top) = stack.pop() {  println!("{}", top);}// 3// 2// 1
复制代码

for 循环中的模式

for关键字后面作为模式,用来匹配 in 关键字后面的数据:


let v = vec!['a', 'b', 'c'];for (index, value) in v.iter().enumerate() {  println!("{} is at index {}", value, index);}// a is at index 0// b is at index 1// c is at index 2
复制代码

let 语句中的模式

用于声明变量的let关键字其实也是在做模式匹配:


let PATTERN = EXPRESSION;
复制代码


匹配单个值:


let v = 5;
复制代码


匹配元组:


let (x, y, z) = (1, 2, 3);
复制代码


模式中要与数据有相同的元素数量:


let (x, y) = (1, 2, 3); // 报错,预期3个元素,只发现了2个
复制代码

函数参数中的模式

函数参数作为模式,用于匹配调用函数时传入的数据,匹配单个值:


fn foo(x: i32) {}
复制代码


还可以解构元组:


fn print_position(&(x, y): &(i32, i32)) {  println!("({}, {})", x, y); // (3, 5)}let point = (3, 5);print_position(&point);
复制代码


封面图:跟着Tina画美国


关注「码生笔谈」公众号,阅读更多最新章节

发布于: 21 小时前阅读数: 4
用户头像

码生笔谈

关注

欢迎关注「码生笔谈」公众号 2018.09.09 加入

前端、Rust干货分享,一起成为更好的Javascripter & Rustacean

评论

发布
暂无评论
5分钟速读之Rust权威指南(三十六)模式匹配