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

1. 概述

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

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

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

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

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

其中,函数参数、let语句、for循环只接受无可辩驳的模式。if let和while 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表达除了最后一个分支的所有分支必须是可辩驳的(即可失败的),而最后一个分支因为是不可辩驳的,因为它需要匹配所有剩余的情况。

相关推荐
陈随易1 小时前
Cloudflare 出钱,Vite 团队挑人,44 个维护者分 30 万美元
前端·后端·程序员
恋猫de小郭2 小时前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter
严肃小白兔2 小时前
TanStack Router 更新构建工具链:Node.js 兼容性、路由分割与前端工程实践
前端·node.js·状态模式
IT_陈寒3 小时前
Vue这个奇葩的响应式问题让我加班到凌晨
前端·人工智能·后端
风骏时光牛马3 小时前
功能可用性自动化测试验证
前端
LucianaiB13 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
excel13 小时前
JavaScript 对象池:减少高频对象创建与 GC 压力
前端
灿飞屋13 小时前
Rust 编程其实很简单
开发语言·rust
陈随易15 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
子兮曰16 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome