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画美国

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享