【Rust】18.2. 可辩驳性:模式是否会无法匹配

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

18.2.1. 模式的两种形式

模式有两种形式:

  • 可辩驳的(可失败的)
  • 无可辩驳的(不可失败的),可以把它理解为不会失败的,怎么写都会成功

其中能匹配任何可能传递的值的模式:无可辩驳的。看个例子:

rust 复制代码
let x = 5;

这个语句是不可能失败的,因为x能匹配表达式右侧所有可能的返回值。

对于某些可能的值,无法进行匹配的模式:可辩驳的。举个例子:

rust 复制代码
if let Some(x) = a_value

如果右边的值是None的话就会发生不匹配的情况。

函数参数、let语句、for循环只接受无可辩驳模式。看例子:

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

Some(x) = a是可辩驳的 (因为有可能出现None的情况),但是let语句只接受无可辩驳 模式,所以编译器会报错。那么怎么修改呢?使用if let即可:

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

if let和while let支持可辩驳 和无可辩驳 模式。实际上,如果在if let和while let中使用无可辩驳模式编译器会发出警告,因为存在可能的失败。看个例子:

rust 复制代码
if let x = 5 {
    println!("{x}");
};

输出:

复制代码
$ cargo run
   Compiling patterns v0.1.0 (file:///projects/patterns)
warning: irrefutable `if let` pattern
 --> src/main.rs:2:8
  |
2 |     if let x = 5 {
  |        ^^^^^^^^^
  |
  = note: this pattern will always match, so the `if let` is useless
  = help: consider replacing the `if let` with a `let`
  = note: `#[warn(irrefutable_let_patterns)]` on by default

warning: `patterns` (bin "patterns") generated 1 warning
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.39s
     Running `target/debug/patterns`
5

编译器会报警"irrefutable if-let pattern"。因为在一个可辩驳 的模式里使用无可辩驳模式是没有任何意义的。

基于这些概念,我们想一下match表达式的分支:除了最后一个分支以外应该都是可辩驳的,而最后一个分支应该是无可辩驳的,因为这个分支需要匹配所有的剩余情况。

相关推荐
学长毕设23 分钟前
基于SpringBoot的游乐园管理系统-附源码
java·spring boot·后端
橙序员小站34 分钟前
Windows 安装包反复报错?一次排查补上了 5 个 CI 检查点
后端
陈随易39 分钟前
Cloudflare 出钱,Vite 团队挑人,44 个维护者分 30 万美元
前端·后端·程序员
码途行者1 小时前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
SimonKing1 小时前
震惊:怎么回事,opencode一轮对话耗尽免费额度
java·后端·程序员
旖旎夜光1 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
张彦峰ZYF1 小时前
功能齐了不等于能上线:智能工单系统的AI回归测试、安全防护、成本可观测与CI/CD生产部署
后端·企业智能工单系统·评测线·安全线·成本线·部署线
Rain的Java大神之路1 小时前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
你看我名字1 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
量化分析码农2 小时前
【Python量化波动率实战 05】你的组合真的分散了吗:滚动相关与分散化收益
后端