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

相关推荐
这儿有一堆花4 小时前
住宅代理(Residential Proxy)技术指南
开发语言·数据库·php
一只大袋鼠5 小时前
Java进阶:CGLIB动态代理解析
java·开发语言
秦ぅ时5 小时前
保姆级教程|OpenAI tts-1-hd模型调用全流程(Python+curl+懒人用法)
开发语言·python
ailab5 小时前
研发人员如何写好 AI 提示词:从“问问题”到“驱动研发闭环”
后端
Eiceblue5 小时前
使用 C# 将 Excel 转换为 Markdown 表格(含批量转换示例)
开发语言·c#·excel
爱滑雪的码农5 小时前
Java基础十三:Java中的继承、重写(Override)与重载(Overload)详解
java·开发语言
ltl5 小时前
【大模型基础设施工程】25:大模型基础设施未来
后端
Java面试题总结5 小时前
使用 Python 设置 Excel 数据验证
开发语言·python·excel
ltl5 小时前
【大模型基础设施工程】二十四:成本、合规与安全
后端
【 】4235 小时前
C++&STL(Standard Template Library,标准模板库)
java·开发语言·c++