【跟小嘉学 Rust 编程】十八、模式匹配(Patterns and Matching)

系列文章目录

【跟小嘉学 Rust 编程】一、Rust 编程基础
【跟小嘉学 Rust 编程】二、Rust 包管理工具使用
【跟小嘉学 Rust 编程】三、Rust 的基本程序概念
【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念
【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据
【跟小嘉学 Rust 编程】六、枚举和模式匹配
【跟小嘉学 Rust 编程】七、使用包(Packages)、单元包(Crates)和模块(Module)来管理项目
【跟小嘉学 Rust 编程】八、常见的集合
【跟小嘉学 Rust 编程】九、错误处理(Error Handling)
【跟小嘉学 Rust 编程】十一、编写自动化测试
【跟小嘉学 Rust 编程】十二、构建一个命令行程序
【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包
【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io
【跟小嘉学 Rust 编程】十五、智能指针(Smart Point)
【跟小嘉学 Rust 编程】十六、无畏并发(Fearless Concurrency)
【跟小嘉学 Rust 编程】十七、面向对象语言特性
【跟小嘉学 Rust 编程】十八、模式匹配(Patterns and Matching)

### 文章目录

  • [系列文章目录](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [@TOC(文章目录)](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [前言](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [一、 使用到模式的地方](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [1.1、match 分支](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [1.2、if let 条件表达式](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [1.3、while let 条件循环](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [1.4、for 循环](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [1.5、let 语句](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [1.6、函数参数](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [二、可辩驳性(Refutability)](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [2.1、模式的两种形式](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [三、模式匹配语法(Pattern Syntax)](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.1、模式匹配字面值(Matching Literals)](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.2、匹配命名变量](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.3、多种模式](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.4、匹配范围](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.5、解构分解值](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.5.1、解构结构](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.5.2、灵活匹配](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.5.3、解构枚举](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.5.3、嵌套枚举和结构](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.5.4、解构结构和元组](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.6、模式中忽略值](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.6.1、忽略某个值](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.6.2、忽略值的某一部分](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.6.3、忽略未使用变量警告](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.6.4、使用.. 忽略值的剩余部分](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.6.5、match 守卫](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [3.6.6、@ 绑定](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)
  • [总结](#文章目录 系列文章目录 @TOC 前言 一、 使用到模式的地方 1.1、match 分支 1.2、if let 条件表达式 1.3、while let 条件循环 1.4、for 循环 1.5、let 语句 1.6、函数参数 二、可辩驳性(Refutability) 2.1、模式的两种形式 三、模式匹配语法(Pattern Syntax) 3.1、模式匹配字面值(Matching Literals) 3.2、匹配命名变量 3.3、多种模式 3.4、匹配范围 3.5、解构分解值 3.5.1、解构结构 3.5.2、灵活匹配 3.5.3、解构枚举 3.5.3、嵌套枚举和结构 3.5.4、解构结构和元组 3.6、模式中忽略值 3.6.1、忽略某个值 3.6.2、忽略值的某一部分 3.6.3、忽略未使用变量警告 3.6.4、使用.. 忽略值的剩余部分 3.6.5、match 守卫 3.6.6、@ 绑定 总结)

前言

模式是Rust的一种特殊语法,用于匹配复杂的和简单类型的结构,模式与匹配表达式和其他构造结合使用,可以更好的控制流。

模式由下列元素或组合组成

  • 字面值
  • 解构的数组、enum、struct、tuple
  • 变量
  • 通配符
  • 占位符

想要使用模式,需要将其与某个值进行比较,如果模式匹配,就可以在代码中使用这个值的想应部分。

主要教材参考 《The Rust Programming Language》


一、 使用到模式的地方

1.1、match 分支

rust 复制代码
match VALUE {
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
}

要求分支能够详尽所有可能性

特殊的模式: _,匹配任何值,不会绑定到变量,通常用于match的最后一个分支,用于忽略某些值。

1.2、if let 条件表达式

if let 表达式主要是作为简短的方式来替代只有一个匹配项的match,if let 可选的可以拥有 else(else if 和 else if let),但是 if let 不会检查穷尽性。

rust 复制代码
fn main() {
    let favorite_color: Option<&str> = None;
    let is_tuesday = false;
    let age: Result<u8, _> = "34".parse();

    if let Some(color) = favorite_color {
        println!("Using your favorite color, {color}, as the background");
    } else if is_tuesday {
        println!("Tuesday is green day!");
    } else if let Ok(age) = age {
        if age > 30 {
            println!("Using purple as the background color");
        } else {
            println!("Using orange as the background color");
        }
    } else {
        println!("Using blue as the background color");
    }
}

1.3、while let 条件循环

只要模式继续匹配就允许循环执行。

rust 复制代码
    let mut stack = Vec::new();

    stack.push(1);
    stack.push(2);
    stack.push(3);

    while let Some(top) = stack.pop() {
        println!("{}", top);
    }

1.4、for 循环

rust 复制代码
    let v = vec!['a', 'b', 'c'];

    for (index, value) in v.iter().enumerate() {
        println!("{} is at index {}", value, index);
    }

1.5、let 语句

rust 复制代码
let PATTERN = EXPRESSION;
let (x, y, z) = (1, 2, 3);

1.6、函数参数

rust 复制代码
fn foo(x: i32) {
    // code goes here
}

fn print_coordinates(&(x, y): &(i32, i32)) {
    println!("Current location: ({}, {})", x, y);
}

fn main() {
    let point = (3, 5);
    print_coordinates(&point);
}

二、可辩驳性(Refutability)

可辩驳性:模式是否会无法匹配。

2.1、模式的两种形式

  • 模式有两种形式:可辩驳的,无可辩驳的
  • 能够匹配任何可能传递的值的模式:无可辩驳的
  • 对于某些可能的值,无法进行匹配的模式:可辩驳的
  • 函数参数、let 语句、for 循环只接受无可辩驳的模式
  • if let 和while let 接受可辩驳的和无可辩驳的模式

三、模式匹配语法(Pattern Syntax)

3.1、模式匹配字面值(Matching Literals)

rust 复制代码
    let x = 1;

    match x {
        1 => println!("one"),
        2 => println!("two"),
        3 => println!("three"),
        _ => println!("anything"),
    }

3.2、匹配命名变量

rust 复制代码
    let x = Some(5);
    let y = 10;

    match x {
        Some(50) => println!("Got 50"),
        Some(y) => println!("Matched, y = {y}"),
        _ => println!("Default case, x = {:?}", x),
    }

    println!("at the end: x = {:?}, y = {y}", x);

3.3、多种模式

rust 复制代码
    let x = 1;

    match x {
        1 | 2 => println!("one or two"),
        3 => println!("three"),
        _ => println!("anything"),
    }

3.4、匹配范围

示例:匹配数值范围

rust 复制代码
    let x = 5;

    match x {
        1..=5 => println!("one through five"),
        _ => println!("something else"),
    }

示例:匹配字符串范围

rust 复制代码
    let x = 'c';

    match x {
        'a'..='j' => println!("early ASCII letter"),
        'k'..='z' => println!("late ASCII letter"),
        _ => println!("something else"),
    }

3.5、解构分解值

3.5.1、解构结构

示例:

rust 复制代码
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let p = Point { x: 0, y: 7 };

    let Point { x: a, y: b } = p;
    assert_eq!(0, a);
    assert_eq!(7, b);
    
 	let Point { x, y } = p;
    assert_eq!(0, x);
    assert_eq!(7, y);
}

3.5.2、灵活匹配

rust 复制代码
fn main() {
    let p = Point { x: 0, y: 7 };

    match p {
        Point { x, y: 0 } => println!("On the x axis at {x}"),
        Point { x: 0, y } => println!("On the y axis at {y}"),
        Point { x, y } => {
            println!("On neither axis: ({x}, {y})");
        }
    }
}

3.5.3、解构枚举

rust 复制代码
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

fn main() {
    let msg = Message::ChangeColor(0, 160, 255);

    match msg {
        Message::Quit => {
            println!("The Quit variant has no data to destructure.");
        }
        Message::Move { x, y } => {
            println!("Move in the x direction {x} and in the y direction {y}");
        }
        Message::Write(text) => {
            println!("Text message: {text}");
        }
        Message::ChangeColor(r, g, b) => {
            println!("Change the color to red {r}, green {g}, and blue {b}",)
        }
    }
}

3.5.3、嵌套枚举和结构

rust 复制代码
enum Color {
    Rgb(i32, i32, i32),
    Hsv(i32, i32, i32),
}

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(Color),
}

fn main() {
    let msg = Message::ChangeColor(Color::Hsv(0, 160, 255));

    match msg {
        Message::ChangeColor(Color::Rgb(r, g, b)) => {
            println!("Change color to red {r}, green {g}, and blue {b}");
        }
        Message::ChangeColor(Color::Hsv(h, s, v)) => {
            println!("Change color to hue {h}, saturation {s}, value {v}")
        }
        _ => (),
    }
}

3.5.4、解构结构和元组

rust 复制代码
let ((feet, inches), Point { x, y }) = ((3, 10), Point { x: 3, y: -10 });

3.6、模式中忽略值

3.6.1、忽略某个值

rust 复制代码
fn foo(_: i32, y: i32) {
    println!("This code only uses the y parameter: {}", y);
}

fn main() {
    foo(3, 4);
}

3.6.2、忽略值的某一部分

范例1:

rust 复制代码
    let mut setting_value = Some(5);
    let new_setting_value = Some(10);

    match (setting_value, new_setting_value) {
        (Some(_), Some(_)) => {
            println!("Can't overwrite an existing customized value");
        }
        _ => {
            setting_value = new_setting_value;
        }
    }

    println!("setting is {:?}", setting_value);

范例2:

rust 复制代码
    let numbers = (2, 4, 8, 16, 32);

    match numbers {
        (first, _, third, _, fifth) => {
            println!("Some numbers: {first}, {third}, {fifth}")
        }
    }

3.6.3、忽略未使用变量警告

rust 复制代码
fn main() {
    let _x = 5;
    let y = 10;
    
    let s = Some(String::from("Hello!"));

    if let Some(_) = s {
        println!("found a string");
    }
    println!("{:?}", s);
}

3.6.4、使用... 忽略值的剩余部分

rust 复制代码
    struct Point {
        x: i32,
        y: i32,
        z: i32,
    }

    let origin = Point { x: 0, y: 0, z: 0 };

    match origin {
        Point { x, .. } => println!("x is {}", x),
    }

 	let numbers = (2, 4, 8, 16, 32);
    match numbers {
        (first, .., last) => {
            println!("Some numbers: {first}, {last}");
        }
    }

3.6.5、match 守卫

match 守卫是 match 分支模式后额外的 if 条件,想要匹配该条件也必须满足

rust 复制代码
    let num = Some(4);

    match num {
        Some(x) if x % 2 == 0 => println!("The number {} is even", x),
        Some(x) => println!("The number {} is odd", x),
        None => (),
    }

3.6.6、@ 绑定

rust 复制代码
    enum Message {
        Hello { id: i32 },
    }

    let msg = Message::Hello { id: 5 };

    match msg {
        Message::Hello {
            id: id_variable @ 3..=7,
        } => println!("Found an id in range: {}", id_variable),
        Message::Hello { id: 10..=12 } => {
            println!("Found an id in another range")
        }
        Message::Hello { id } => println!("Found some other id: {}", id),
    }

总结

以上就是今天要讲的内容

相关推荐
小糯米6011 分钟前
JavaScript表达式与运算符
开发语言·javascript·ecmascript
北极星日淘4 分钟前
煤炉自动代拍功能开发 | Python 异步任务实现批量下单
开发语言·python·自动化
体验家24 分钟前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
金融支付架构实战指南29 分钟前
Milvus 向量检索服务 + SpringBoot 实战:电商商品语义检索与相似商品推荐
spring boot·后端·milvus·向量检索
二十七剑33 分钟前
LangGraph 源码深度解析:Node 节点 Protocol 与 StateNodeSpec 核心机制
开发语言·python
AC赳赳老秦36 分钟前
OpenClaw + 云数据库运维:自动备份、扩容、迁移 RDS/MySQL 云数据库
运维·开发语言·数据库·人工智能·python·mysql·openclaw
醉城夜风~36 分钟前
类和对象III
开发语言·c++
冷小鱼38 分钟前
高级研发编码习惯:从规范到艺术,再到AI+时代的人机协同
java·开发语言·python·编码习惯
齐 飞42 分钟前
JDK21虚拟线程
java·后端
fox_lht1 小时前
15.4.循环和迭代器的性能比较
开发语言·后端·学习·rust