【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 letwhile let支持可辩驳无可辩驳 模式。实际上,如果在if letwhile 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表达式的分支:除了最后一个分支以外应该都是可辩驳的,而最后一个分支应该是无可辩驳的,因为这个分支需要匹配所有的剩余情况。

相关推荐
大鸡腿同学1 小时前
身弱体质|你的 FM 该关了📻
后端
叠层归一研究院1 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
明朝百晓生2 小时前
Deep RL learning[2026/8]
开发语言·javascript·人工智能
Csvn2 小时前
📊 SQL 入门 Day 18:索引原理
后端·sql
Csvn2 小时前
🐍 Day3 : Python 容器精讲 — list、dict、set、tuple 底层实现与高级操作
后端·python
用户938515635072 小时前
ESLint 代码规范完全指南——从 AST 原理到 flat config 逐行解析
javascript·后端·代码规范
用户938515635072 小时前
深入理解 Next.js:从 SPA 的 SEO 问题到约定式路由与 SSR 原理
前端·后端·全栈
weixin-a153003083162 小时前
python-装饰器
开发语言·python
我的xiaodoujiao3 小时前
快速学习Python基础知识详细图文教程17--类型注解和断点调试
开发语言·python·学习·测试工具
码事漫谈4 小时前
Deepseek涨价了,前后对比,竟然差这么多
后端