使用模式匹配的场合
前面我们有讲过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画美国
关注「码生笔谈」公众号,阅读更多最新章节
评论