这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战
match控制流运算符
Rust有一个叫做match
的几位强大的控制流运算符,match
允许将一个值与一系列的模式相比较并根据相匹配的模式执行相应代码。
模式可由字面值、变量、通配符和许多其他内容构成;match
的强大之处在于它可以确保所有的可能情况都得到处理。
我们可以将 match
表达式想象成某种硬币分类器:硬币滑入有着不同大小孔洞的轨道,每一个硬币都会掉入符合它大小的孔洞。同样地,值也会通过 match
的每一个模式,并且在遇到第一个 “符合” 的模式时,值会进入相关联的代码块并在执行中被使用。
就使用上面提到的硬币进行代码演示,我们可以编写一个函数类获取硬币,并使用硬币分离器区分硬币面值并返回该硬币的面值:
enum Coin {
One,
Five,
Ten,
}
fn main() -> u8 {
math coin {
Coin::One => 1,
Coin::Five => 5,
Coin::Ten => 10,
}
}
首先看main
函数中的match
:
- 首先列出`match`关键字,后面更一个表达式,这个表达式就是`coin`的值,这种方式很想`if`表达式,但是和`if`表达式有很大的区别,对于`if`表达式必须返回一个布尔值,而这里返回的值可以是任意类型的,在上述代码示例中`coin`的类型是`Coin`枚举。
- 然后是`match`的分支,一个分支有两部分组成,第一部分可以理解为条件或者模式,第二部分就是条件/模式符合之后需要执行或者返回的代码,两部分使用`=>`分隔。
- 当`match`表达式执行时,会将结果按顺序与每一个分支的条件/模式进行比较,如果模式匹配了这个值,这个模式相关联的代码将被执行。如果模式并不匹配这个值,将继续执行下一个分支。
- 每个分支相关联的代码是一个表达式,而表达式的结果值将作为整个 match 表达式的返回值。
- 如果想要在分支中运行多行代码,可以使用大括号。如下实例代码,在每次使用Coin::One 调用时都会打印出 “好穷哦”,同时仍然返回代码块最后的值,1
fn main() -> u8 {
match coin {
Coin::One => {
println!("好穷哦");
1
},
Coin::Five => 5,
Coin::Ten => 10,
}
}
_通配符
Rust提供了一种用于不想列举出所有可能值得场景,比如说u8
得范围是0-255
,如果我们只关心1、3、5 和 7 这几个值,而且并不想必须列出 0、2、4、6、8、9 一直到 255 的值。这时就可以使用_
通配符模式去代替哪些我们不想列出的值,如下实例代码:
fn main() {
let some_u8_value = 0u8;
match some_u8_value {
1 => println!("one"),
3 => println!("three"),
5 => println!("five"),
7 => println!("seven"),
_ => (),
}
}
_
可以匹配所有的值,如果讲其其放置于其他分支之后,_
将会匹配所有之前没有指定的可能的值。上述代码示例当匹配到_
时就什么都不做。
match
在只关心一个情况的场景下可能有点啰嗦,因此我们会在下一篇文章中介绍Rust的if let
。
结语
文章首发于微信公众号程序媛小庄,同步于掘金。
码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)