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

news/2025/2/1 10:36:15 标签: rust, 开发语言, 后端

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

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.niftyadmin.cn/n/5839303.html

相关文章

pytorch实现变分自编码器

变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09;是一种生成模型&#xff0c;属于深度学习中的无监督学习方法。它通过学习输入数据的潜在分布&#xff08;Latent Distribution&#xff09;&#xff0c;生成与输入数据相似的新样本。VAE 可以用于数据生成、降…

黑马点评 - 商铺类型缓存练习题(Redis List实现)

首先明确返回值是一个 List<ShopType> 类型那么我们修改此函数并在 TypeService 中声明 queryTypeList 方法&#xff0c;并在其实现类中实现此方法 GetMapping("list")public Result queryTypeList() {return typeService.queryTypeList();}实现此方法首先需要…

Git进阶之旅:Git 多人合作

项目克隆&#xff1a; git clone 仓库地址&#xff1a;把远程项目克隆到本地形成一个本地的仓库 克隆下来的仓库和远程仓库的名称一致 注意&#xff1a;git clone 远程仓库地址 远程仓库名&#xff1a;把远程仓库克隆下来&#xff0c;并自定义仓库名 多人协作&#xff1a; …

JAVA实战开源项目:企业客户管理系统(Vue+SpringBoot) 附源码

本文项目编号 T 036 &#xff0c;文末自助获取源码 \color{red}{T036&#xff0c;文末自助获取源码} T036&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 管理员角色1.2 普通员工角色1.3 系统特点 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内…

pytorch实现基于Word2Vec的词嵌入

PyTorch 实现 Word2Vec&#xff08;Skip-gram 模型&#xff09; 的完整代码&#xff0c;使用 中文语料 进行训练&#xff0c;包括数据预处理、模型定义、训练和测试。 1. 主要特点 支持中文数据&#xff0c;基于 jieba 进行分词 使用 Skip-gram 进行训练&#xff0c;适用于小数…

基于Spring Security 6的OAuth2 系列之七 - 授权服务器--自定义数据库客户端信息

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…

【算法设计与分析】实验2:递归与分治—Hanoi塔、棋盘覆盖、最大子段和

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握递归求解问题的思想及对应的程序编码结构。针对不同的问题&#xff0c;能够利用递归进行问题求解&#xff0c;并利用Jav…

RK3568使用QT搭建TCP服务器和客户端

文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. widget.h 文件2. widget.cpp 文件**详细讲解**1. **Widget 类构造函数 (Widget::Widget)**2. **UI 布局 (setupUI)**3. **连接按钮的槽函数 (onConnectClicked)**4. **发送消息按钮的槽函数 (onSendMessageClicked)**…