- 模式是 Rust 的一种特殊语法,用于匹配复杂和简单类型的结构
- 将模式与匹配表达式和其他构造结合使用,可以更好地控制程序的控制流
- 模式由以下元素 (的一些组合) 组成:
- 字面值
- 解构的数组、enum、struct 和 tuple
- 变量
- 通配符
- 占位符
- 想要使用模式,需要将其与某个值比较
- 如果可以模式匹配,就可以在代码中使用这个值的相应部分
可用用到模式匹配的地方
match 的分支
- 要求分支需要包含所有的可能性
_
: 可以匹配任何东西,不会绑定到变量,通常用于 match 的最后一个分支,或用于忽略某些值
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
if let
- 简单的控制流表达式,处理只关心一种匹配而忽略其他匹配的情况,放弃了穷举的可能性,可以理解成 match 的简化版
- 主要是作为一种简短的方式来等价的代替只有一个匹配项的 match
if let
可选的可以拥有else
else if
else if let
if let
不会检查穷尽性
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
while let 条件循环
- 只有模式继续满足匹配的条件,那它运行 while 循环一直运行
1 2 3 4 |
|
for 循环
1 2 3 4 |
|
let 语句
1 2 |
|
函数参数
1 2 3 4 5 |
|
模式的可辩驳性
- 模式有两种形式: 可辩驳的(可失败的), 无可辩驳的(不可失败的)
- 能匹配任何可能传递的值的模式: 无可辩驳的
- 例如:
let x = 5
- 例如:
- 对于某些可能的值,无法继续匹配的模式: 可辩驳的
- 例如:
if let Some(x) = val
- 例如:
- 能匹配任何可能传递的值的模式: 无可辩驳的
- 函数参数、let 语句、for 循环只接收无可辩驳的模式
if let
和while let
接收可辩驳和无可辩驳的模式- match 语句,除了最后一个分支是无可辩驳的,其他分支为可辩驳
匹配语法
匹配字面值
1 2 3 4 5 6 7 8 |
|
匹配命名变量
- 命名的变量是可匹配任何值的无可辩驳模式
1 2 3 4 5 6 7 8 9 10 11 12 |
|
多重模式
- match 可使用
|
(或运算符), 可以匹配多种模式
1 2 3 4 5 6 7 |
|
匹配范围
1 2 3 4 5 6 |
|
使用模式来解构分解值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 |
|
在模式中忽略值
_
: 可用来忽略某个值- 使用以
_
开头的名称: 标记该值不会被用到 ..
: 忽略值的剩余部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
match guard
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 |
|
@ 绑定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|