写点什么

5 分钟速读之 Rust 权威指南(三十七)模式性质

用户头像
码生笔谈
关注
发布于: 51 分钟前
5分钟速读之Rust权威指南(三十七)模式性质

模式匹配的可失败性质

上一节中我们学到了哪些位置可以使用模式匹配,本节我们看来一下匹配的两种分类:不可失败(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 letwhile let表达式则只接收可失败模式,因为它们在失败是允许做其他的操作。

可失败的场合使用不可失败的匹配

再来,我们在if let语句后面使用不可失败的匹配的话,看看会有什么情况发生:


if let x = 5 { // 编译器提醒: 这里的匹配没有意义  println!("{}", x);}
复制代码


虽然可以编译通过,但是编译器还是会报提醒,左边的模式是不可失败的。

match 表达式

match表达式的匹配分支中,最后一个允许使用不可失败模式的匹配,其他的必须全部使用可失败模式,由于match需要覆盖所有情况,最后一个分支需要匹配值的所有剩余的情形,这里就不再举例了,大家可以手动去尝试下。


关注「码生笔谈」公众号,阅读更多最新章节

发布于: 51 分钟前阅读数: 2
用户头像

码生笔谈

关注

欢迎关注「码生笔谈」公众号 2018.09.09 加入

前端、Rust干货分享,一起成为更好的Javascripter & Rustacean

评论

发布
暂无评论
5分钟速读之Rust权威指南(三十七)模式性质