60_模式匹配可辩驳性和基本语法

1. 概述

模式的两种形式包括:可辩驳的(可反驳的或可失败的)、无可辩驳的(不可反驳的或不可失败的)。

能够匹配任何可能传递的值的模式是无可辩驳的,即不能失败,怎么匹配都会成功。

  • 例如let x = 5不可能失败,它能匹配所有表达式右侧的值。

对于某些可能的值,无法进行匹配的模式,就是可辩驳的。

  • 例如if let Some(x) = a_value,如果右边的值是null,这时候就会发生不匹配的情况,这就是可辩驳的,或者可失败的。

其中,函数参数、let语句、for循环只接受无可辩驳的模式。if letwhile let接受可辩驳和无可辩驳的模式。在接受无可辩驳模式的时候编译器可能会发生警告,因为存在可能的失败。

如下例子:

rust 复制代码
fn main() {
    let a: Option<i32> = Some(5);
    // Some是个可辩驳的
    let Some(x) = a;
}

a是Option类型,而Some是一个可辩驳的,以上代码将会编译错误,可以修改为如下代码

rust 复制代码
fn main() {
    let a: Option<i32> = Some(5);
    if let Some(x) = a {

    }
}

但是如果我们改为不可辩驳的模式,如下

rust 复制代码
fn main() {
    let a: Option<i32> = Some(5);
    if let x = 5 {}
}

代码不会报错,但是x = 5总是匹配成功的,所以使用一个可辩驳的模式没有任何意义。结合上面的示例,我们可以想到match表达除了最后一个分支的所有分支必须是可辩驳的(即可失败的),而最后一个分支因为是不可辩驳的,因为它需要匹配所有剩余的情况。

相关推荐
云小遥28 分钟前
Cornerstone3D 2.x升级调研
前端·数据可视化
李明卫杭州34 分钟前
浅谈JavaScript中Blob对象
前端·javascript
springfe010134 分钟前
Cesium 3D地图 图元 圆柱 图片实现
前端·cesium
meng半颗糖37 分钟前
vue3 双容器自动扩展布局 根据 内容的多少 动态定义宽度
前端·javascript·css·vue.js·elementui·vue3
yt9483238 分钟前
jquery和CSS3圆形倒计时特效
前端·css3·jquery
teeeeeeemo40 分钟前
CSS3 动画基础与技巧
前端·css·笔记·css3
年纪轻轻就扛不住42 分钟前
CSS3 渐变效果
前端·css·css3
Aisanyi1 小时前
【鸿蒙开发】使用HMRouter路由的使用
前端·harmonyos
杉木笙1 小时前
Flutter 代码雨实现(矩阵雨)DLC 多图层
前端·flutter
SouthernWind1 小时前
Vista AI 演示—— 提示词优化功能
前端·vue.js