当前位置: 首页 > article >正文

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

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

18.2.1. 模式的两种形式

模式有两种形式:

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

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

let x = 5;

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

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

if let Some(x) = a_value

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

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

let a:Option<i32> = Some(5);
let Some(x) = a;

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

let a:Option<i32> = Some(5);
if let Some(x) = a {
	// ...
}

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

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


http://www.kler.cn/a/527965.html

相关文章:

  • 【C++ 数学 括号匹配】2116. 判断一个括号字符串是否有效|2037
  • 使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(31):HTTPS和TLS/SSL
  • 【力扣】49.字母异位词分组
  • 搜索引擎快速收录:关键词布局的艺术
  • volatile
  • Python 梯度下降法(五):Adam Optimize
  • Java动态代理:原理与实现
  • 家庭财务管理系统的设计与实现
  • Spring的设计理念之IOC
  • 软件渲染器tinyrenderer
  • OpenCV:SIFT关键点检测与描述子计算
  • caddy2配置http_basic用于验证用户名密码才允许访问页面
  • 代码随想录|动态规划1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
  • 零代码搭建个人博客—Zblog结合内网穿透发布公网
  • 2025 年,链上固定收益领域迈向新时代
  • I.MX6ULL 中断介绍上
  • 推荐一款好看的Typora主题页面
  • MATLAB R2023b下载与安装教程
  • MongoDb user自定义 role 添加 action(collStats, EstimateDocumentCount)
  • 【MATLAB例程】TOA和AOA混合的高精度定位程序,适用于三维、N锚点的情况
  • 【vue项目权限控制方案】
  • Linux stat 命令使用详解
  • 内部知识库提升组织效率与知识共享助力业务快速发展
  • 开源的瓷砖式图像板系统Pinry
  • MySQL 插入数据