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

相关推荐
薇茗几秒前
【初阶数据结构】 升沉有序的平仄 排序 3
c语言·开发语言·数据结构·算法·排序算法·文件归并排序
字节高级特工2 分钟前
C++11(一) 革新:右值引用与移动语义
java·开发语言·c++·人工智能·后端
AI科技星7 分钟前
强哥德巴赫猜想(1+1)终极证明(2026 年5月 21 日)
开发语言·人工智能·算法·计算机视觉·量子计算
青云计划7 分钟前
Synchronized 锁升级:从偏向锁到重量级锁的性能进化之路
java·后端
故事和你9112 分钟前
洛谷-【图论2-4】连通性问题2
开发语言·数据结构·c++·算法·动态规划·图论
Brilliantwxx13 分钟前
【C++】 二叉搜索树
开发语言·c++·算法
为何创造硅基生物9 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好9 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李9 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅9 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法