【Rust自学】18.1. 能用到模式(匹配)的地方

embedded/2025/2/2 17:28:10/

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

18.1.1. 什么是模式

模式(pattern) 是Rust里的一种特殊的语法,用于匹配复杂和简单类型的结构。

将模式与匹配表达式和其他构造结合使用,可以更好地控制程序的控制流。

模式由以下元素(的一些组合)组成:

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

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

18.1.2. matchArm

Arm(分支)就可以使用模式。它的形式是:

rust">match VALUE {PATTERN => EXPRESSION,PATTERN => EXPRESSION,PATTERN => EXPRESSION,
}

match的要求是详尽(尽可能包含所有可能性),必须把所有的可能性写全。

match还经常用到_,它会匹配任何东西。它并不会绑定到变量上。它通常用于match的最糊一个分支,或用于忽略某个值。

如果想要看更详细的介绍,可以去 6.3. 控制流运算符-match

18.1.3. if let表达式

if let表达式可以看作是match表达式只匹配一种可能性的形式。

它可选地可以拥有,包括:

  • else if
  • else
  • else if let

if let相比于match的缺点在于不会检查穷尽性,如果我们省略了最后一个else块并因此错过了对某些情况的处理,编译器将不会提醒我们可能的逻辑错误。看个例子:

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");}
}

如果用户指定最喜欢的颜色,则该颜色将用作背景。如果没有指定最喜欢的颜色并且今天是星期二,则背景颜色为绿色。否则,如果用户将他们的年龄指定为字符串,并且我们可以成功将其解析为数字,则颜色为紫色或橙色,具体取决于数字的值。如果这些条件都不适用,则背景颜色为蓝色。

这种条件结构使我们能够支持复杂的需求。使用我们这里的硬编码值,此示例将打印 Using purple as the background color

你可以看到, if let也可以采用与match相同的方式引入阴影变量: if let Ok(age) = age行引入了一个新的阴影age变量,其中包含Ok变量内的值。这意味着我们需要将if age > 30条件放置在该块中:我们不能将这两个条件组合成 if let Ok(age) = age && age > 30 。我们想要与 30 进行比较的阴影age在新范围以大括号{开头之前才有效。

其余详细内容可见 6.4. 简单的控制流-if let

18.1.4. while let条件循环

while letif let有点相似,只要模式继续满足匹配的条件,那它允许while循环一直运行。

看个例子:

rust">let mut stack = Vec::new();stack.push(1);
stack.push(2);
stack.push(3);while let Some(top) = stack.pop() {println!("{top}");
}

此示例打印 3、2,然后打印 1。 pop方法从向量中取出最后一个元素并返回Some(value) 。如果向量为空, pop 返回None 。只要pop返回Somewhile循环就会继续运行其块中的代码。当pop返回None时,循环停止。我们可以使用while let将每个元素从堆栈中弹出。

18.1.5. for循环

for循环是Rust中Rust中最常见的循环。for循环中,模式就是紧随for关键字后的值。

for循环中,直接跟在关键字for后面的值是一个模式。例如,在for x in y中, x是模式。下面的例子演示了如何在for循环中使用模式来解构或分解元组作为for循环的一部分:

rust">let v = vec!['a', 'b', 'c'];for (index, value) in v.iter().enumerate() {println!("{value} is at index {index}");
}

输出:

a is at index 0
b is at index 1
c is at index 2

其余信息可见 3.6. 控制流:循环

18.1.6. let语句

let语句也是模式,其写法规范是:

rust">let PATTERN = EXPRESSION;

看个例子:

rust">let (x, y, z) = (1, 2, 3);

我们将元组与模式进行匹配。 Rust 比较值(1, 2, 3) 到模式(x, y, z)并看到该值与模式匹配,因此 Rust 将1绑定到x2绑定到y3绑定到z 。你可以将此元组模式视为其中嵌套了三个单独的变量模式。

18.1.7. 函数参数

函数的参数也可以是模式,看个例子:

rust">fn foo(x: i32) {// ...
}

x部分是一个模式。

正如我们对let所做的那样,我们可以将函数参数中的元组与模式进行匹配。如下例:

rust">fn print_coordinates(&(x, y): &(i32, i32)) {println!("Current location: ({x}, {y})");
}fn main() {let point = (3, 5);print_coordinates(&point);
}

http://www.ppmy.cn/embedded/158957.html

相关文章

C++中的类型转换

文章目录 一、概述二、隐式类型转换&#xff08;Implicit Conversion&#xff09;三、显式类型转换&#xff08;Explicit Conversion&#xff09;四、C 风格类型转换 一、概述 C 提供了多种类型转换&#xff08;Type Conversion&#xff09;方式&#xff0c;以便在不同类型的数…

Spring AOP 入门教程:基础概念与实现

目录 第一章&#xff1a;AOP概念的引入 第二章&#xff1a;AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章&#xff1a;Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…

C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】

1. 题目描述 牛客网在线OJ链接 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#xff08;ASCII码值从小到大&#xff09;排列收好。请大家给Lily帮忙&#xff0c;通过C语言解决。 输入描述&#xff1a;Lily使用的图片包括 “A…

JavaScript系列(43)--依赖注入系统实现详解

JavaScript依赖注入系统实现详解 &#x1f489; 今天&#xff0c;让我们深入探讨JavaScript的依赖注入系统实现。依赖注入是一种设计模式&#xff0c;它通过将依赖关系的创建和管理从代码中分离出来&#xff0c;提高了代码的可维护性和可测试性。 依赖注入基础概念 &#x1f…

使用LLaMA-Factory对AI进行认知的微调

使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…

面试经典150题——图的广度优先搜索

文章目录 1、蛇梯棋1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、最小基因变化2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词接龙3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 1、蛇梯棋 1.1 题目链接 点击跳转到题目位置 1.2 题目描述 给你一…

Anaconda使用教程 如何conda配置多版本Python环境

配置anaconda参考anaconda的安装和使用&#xff08;管理python环境看这一篇就够了&#xff09;-CSDN博客 Anaconda使用教程 主要用的两个为Anaconda Prompt 和Anaconda Navigator 打开cmd 第一次安装配置好conda的得先执行 conda init才能用 以后的创建环境和环境切换&…

Redis 的热 Key(Hot Key)问题及解决方法

Redis 的热 Key&#xff08;Hot Key&#xff09;问题及解决方法 1. 什么是 Redis 热 Key&#xff1f; Redis 热 Key&#xff08;Hot Key&#xff09;指的是访问频率极高的 Key&#xff0c;通常会造成以下问题&#xff1a; 单 Key 访问量过大&#xff1a;热点 Key 可能被高并…