19.1 所有可能会用到模式的位置
19.1.1 match 分支
19.1.2 if let 条件表达式
- 可以组合并匹配
if let
、else if
和else if let
表达式,优势在于可以将多个值与模式比较(match
表达式一次只能将一个值与模式比较),且各个分支并不要求其条件相互关联 if let
也可以像match
分支那样引入覆盖变量if let
表达式的缺点在于其穷尽性没有为编译器所检查(不保证覆盖的完备性),而match
表达式则检查了(保证覆盖的完备性)
19.1.3 while let 条件循环
19.1.4 for 循环
for
可以获取一个模式:模式是for
关键字直接跟随的值,正如for x in y
中的x
19.1.5 let 语句
- 如果希望忽略元组中一个或多个值,也可以使用
_
或..
19.1.6 函数参数
19.2 Refutability(可反驳性): 模式是否会匹配失效
- 不可反驳的(irrefutable):能匹配任何传递的可能值的模式
- 可反驳的(refutable):对某些可能的值进行匹配会失败的模式
- 在不可反驳模式的地方使用可反驳模式通常是意义不大的
- 例子:
match
匹配分支必须使用可反驳模式,除了最后一个分支需要使用能匹配任何剩余值的不可反驳模式(其实也可以在只有一个匹配分支的match
中使用不可反驳模式,不过这么做不是特别有用,并可以被更简单的let
语句替代)
19.3 所有的模式语法
19.3.1 匹配字面值
19.3.2 匹配命名变量
- 变量覆盖问题:存在外部变量的,则会优先使用外部变量;在新作用域中的新变量(会忽略外部的同名变量)会匹配任何
Some
中的值!
19.3.3 match 中的多个模式(|)
- 在
match
表达式中,可以使用|
语法匹配多个模式,它代表 或(or)的意思
19.3.4 通过 ..= 匹配值的范围
..=
语法允许你匹配一个闭区间范围内的值,但仅适用于数字或char
值(仅这两种类型可以判断范围是否为空的类型)
19.3.5 解构并分解值(一):解构结构体
- 匹配结构体字段的简写模式(1):只需列出结构体字段的名称,则模式创建的变量会有相同的名称
- 匹配结构体字段的简写模式(2):也可以使用字面值作为结构体模式的一部分进行解构,而不是为所有的字段创建变量(这允许我们测试一些字段是特定值,同时会创建其他字段的变量)
19.3.6 解构并分解值(二):解构枚举
19.3.7 解构并分解值(三):解构嵌套的结构体和枚举
19.3.8 解构并分解值(四):解构结构体和元组
19.3.9 忽略模式中的值(一):使用 _ 忽略整个值
_
:作为匹配但不绑定任何值的通配符模式,可以将其用于任意模式。通常作为match
表达式最后的分支,也可以用作函数参数中
19.3.10 忽略模式中的值(二):使用嵌套的 _ 忽略部分值
- 可以在一个模式内部使用
_
忽略部分值 - 可以在一个模式中的多处使用
_
来忽略特定值
19.3.11 忽略模式中的值(三):通过在名字前以一个下划线开头来忽略未使用的变量
- 告诉 Rust 不要警告未使用的变量:可以用下划线作为变量名的开头(比如:
_x
) - 注意:下划线开头的变量
_x
仍会将值绑定到变量,而_
则完全不会绑定!
19.3.12 忽略模式中的值(四):用 … 忽略剩余值
..
模式会忽略模式中剩余的任何没有显式匹配的值部分,必须是无歧义的
19.3.13 匹配守卫提供的额外条件
- 匹配守卫(match guard)是一个指定于
match
分支模式之后的额外 if 条件,它也必须被满足才能选择此分支;匹配守卫用于表达比单独的模式所能允许的更为复杂的情况(需要同时满足更多条件) - 匹配守卫可以解决模式中变量覆盖的问题!
19.3.14 @ 绑定
@
运算符:允许在创建一个存放值的变量的同时测试其值是否匹配模式,也即先进行匹配测试,若通过则保存变量值到一个新建的变量中