模式匹配的可失败性质
上一节中我们学到了哪些位置可以使用模式匹配,本节我们看来一下匹配的两种分类:不可失败(irrefutable)和可失败(refutable)两种类型
不可失败
下面代码中的x便是不可失败模式:
let x = 5;
复制代码
函数参数、let
语句及for
循环也只接收不可失败模式,在这些场合下,我们的程序在值不匹配时的后续操作都是没有意义的。
不可失败的场合使用可失败的匹配
因为对于rust的安全性来说,不允许出现覆盖不到的情况,如果下面x匹配失败,后续代码会没有意义例如下面的代码:
let v: Option<i32> = None;
let Some(x) = v; // 报错,None没有被覆盖
let y = x + 1; // 后续代码没有意义
复制代码
let
语句只能接收一个不可失败模式,然而上面右侧的值None
,这段代码无法通过None
值执行任何有效的操作。rust会在编译时报错,也就是说该代码需要使用可失败模式。
可失败
if let
语句用于可失败的匹配,为匹配的代码找到了出口,使用else
分支处理不匹配的情况,或者干脆忽略不处理:
let v:Option<i32> = None;
if let Some(x) = v {
// 匹配成功
} else {
// 匹配失败情况,如果不考虑不匹配情况,else分支可以不写
}
复制代码
if let
和while let
表达式则只接收可失败模式,因为它们在失败是允许做其他的操作。
可失败的场合使用不可失败的匹配
再来,我们在if let
语句后面使用不可失败的匹配的话,看看会有什么情况发生:
if let x = 5 { // 编译器提醒: 这里的匹配没有意义
println!("{}", x);
}
复制代码
虽然可以编译通过,但是编译器还是会报提醒,左边的模式是不可失败的。
match表达式
在match
表达式的匹配分支中,最后一个允许使用不可失败模式的匹配,其他的必须全部使用可失败模式,由于match
需要覆盖所有情况,最后一个分支需要匹配值的所有剩余的情形,这里就不再举例了,大家可以手动去尝试下。
关注「码生笔谈」公众号,阅读更多最新章节
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END