使用模式匹配的场合
前面我们有讲过match和if 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 let 和 else分支是可选的:
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 (x, y, z) = (1, 2, 3);
复制代码
模式中要与数据有相同的元素数量:
let (x, y) = (1, 2, 3); // 报错,预期3个元素,只发现了2个
复制代码
函数参数中的模式
函数参数作为模式,用于匹配调用函数时传入的数据,匹配单个值:
还可以解构元组:
fn print_position(&(x, y): &(i32, i32)) { println!("({}, {})", x, y); // (3, 5)}let point = (3, 5);print_position(&point);
复制代码
封面图:跟着Tina画美国
关注「码生笔谈」公众号,阅读更多最新章节
评论