Rust编程的匹配控制语句match

【图书介绍】《Rust编程与项目实战》-CSDN博客

《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)

Rust编程与项目实战_夏天又到了的博客-CSDN博客

学过C语言的同学或许在等switch,明确告诉你们,Rust没有switch,而是提供了功能更加强大的匹配控制语句match。它使我们可以将值与一系列模式进行比较,然后根据匹配的模式执行代码。模式可以由文字值、变量名、通配符和其他内容组成。

match语句是Rust中的一种控制流语句,它可以让我们根据不同的模式匹配执行不同的代码。match语句的基本语法如下:

match value {pattern1 => {// code1}pattern2 => {// code2}_ => {// 没有任何匹配}
}

其中,value是要匹配的变量,pattern是匹配模式,=>后面是要执行的代码块。如果value匹配了某个模式,就会执行对应的代码块。如果value没有匹配任何模式,就会执行默认的代码块(即_ => {…})。

接下来,我们将通过一些示例来介绍match语句的基础用法。

5.2.1  匹配整数

匹配整数就是让待匹配的值和不同的整数比较,代码如下:

fn main() {let x = 1;match x {1 => println!("x is one"),2 => println!("x is two"),_ => println!("x is not one or two"),}
}

在这个示例中,我们定义了一个整数变量x,并使用match语句匹配它。如果x等于1,就会执行第一个代码块,输出"x is one";如果x等于2,就会执行第二个代码块,输出"x is two";如果x不等于1或2,就会执行默认的代码块,输出"x is not one or two"。最终输出结果:x is one。

这个例子是匹配单个值,我们还可以匹配多个值,如果想匹配多个值,不同的值之间用“|”隔开,比如:

fn main() {let number = 7;match number {// 匹配多个值2 | 3 | 5 | 7 | 11 => println!("This is a prime"),// 要覆盖所有的可能分支,不然有编译错误_ => println!("Ain't special"),}
}

结果输出:This is a prime。

5.2.2  匹配枚举类型

枚举是一个数据结构,里面可以包含不同的成员元素。匹配枚举就是让待匹配的值和一个枚举中的不同元素进行比较。枚举我们暂时还没学到,这里暂时不用太深究,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。可以认为,枚举是一个有名称的整型常数的集合。

match匹配枚举的代码如下:

enum Color {Red,Green,Blue,
}let color = Color::Green;match color {Color::Red => println!("The color is red"),Color::Green => println!("The color is green"),Color::Blue => println!("The color is blue"),
}

在这个示例中,我们定义了一个枚举类型Color,并将变量color赋值为Color::Green。然后,使用match语句匹配color。如果color等于Color::Red,就会执行第一个代码块,输出"The color is red";如果color等于Color::Green,就会执行第二个代码块,输出"The color is green";如果color等于Color::Blue,就会执行第三个代码块,输出"The color is blue"。

5.2.3  匹配元组

元组可以将其他不同类型的多个值组合进一个复合类型中。元组还拥有一个固定的长度:你无法在声明结束后增加或减少其中的元素数量。通常使用逗号分隔后放置到一对圆括号中创建一个元组。元组每个位置的值都有一个类型,这些类型不需要是相同的。比如我们定义一个元组:

let tuple:(i32,f64,u8) = (-325,4.9,22);

也可以省略类型,比如:

let point = (1, 2);

匹配元组的代码如下:

let point = (1, 2);match point {(0, 0) => println!("The point is at the origin"),(_, 0) => println!("The point is on the x-axis"),(0, _) => println!("The point is on the y-axis"),(x, y) => println!("The point is at ({}, {})", x, y),
}

在这个示例中,我们定义了一个元组变量point,并使用match语句匹配它。如果point等于(0, 0),就会执行第一个代码块,输出"The point is at the origin";如果point的第二个元素等于0,就会执行第二个代码块,输出"The point is on the x-axis";如果point的第一个元素等于0,就会执行第三个代码块,输出"The point is on the y-axis";否则执行第四个代码块,输出"The point is at ({}, {})"。

5.2.4  匹配范围

匹配范围和匹配多个值有点类似,但匹配多个值可能是不连续的,而匹配范围则是一段连续的值区间。匹配范围的示例代码如下:

let age = 20;match age {0..=17 => println!("You are a minor"),18..=64 => println!("You are an adult"),_ => println!("You are a senior"),
}

在这个示例中,我们定义了一个整数变量age,并使用match语句匹配它。如果age的取值范围为0~17,就会执行第一个代码块,输出"You are a minor";如果age的取值范围为18~64,就会执行第二个代码块,输出"You are an adult";否则执行默认的代码块,输出"You are a senior"。

5.2.5  匹配守卫

匹配守卫(Match Guard)是一个位于 match 分支模式之后的额外 if 条件,它能为分支模式提供进一步的匹配条件。示例代码如下:

let x = 5;match x {n if n < 0 => println!("The value is negative"),n if n > 10 => println!("The value is greater than 10"),_ => println!("The value is between 0 and 10"),
}

在这个示例中,我们定义了一个整数变量 x,并使用 match 语句匹配它。在模式中,我们使用 if 语句添加了一个守卫条件。如果 x 小于 0,就会执行第一个代码块,输出"The value is negative";如果 x 大于 10,就会执行第二个代码块,输出"The value is greater than 10";否则执行默认的代码块,输出"The value is between 0 and 10"。

5.2.6  一些经验

在实际开发中,我们经常需要使用 match 语句来处理复杂的逻辑。以下是一些实践经验,可以帮助我们更好地使用match语句。

经验1:给每个分支加上花括号

在match语句中,每个分支的代码块通常都比较复杂,因此我们应该给每个分支加上花括号,以便更好地阅读和维护代码。例如:

fn main() {let x = 1;match x {1 => {println!("The value is one");println!("This is a long message");}2 => {println!("The value is two");}_ => {println!("The value is not one or two");}}
}

输出结果如下:

The value is one

This is a long message

经验2:使用_忽略不需要的变量

在match语句中,我们可以使用_符号来忽略不需要的变量。这样可以简化代码,并且让代码更加清晰。例如:

let x = (1, 2);match x {(1, _) => println!("The first element is 1"),(_, 2) => println!("The second element is 2"),_ => (),
}

在这个示例中,使用_符号来忽略第二个元素,因为我们只关心第一个元素是否等于1。

经验3:使用if let简化模式匹配

在某些情况下,我们只需要匹配一个模式,而不需要处理其他模式。此时,可以使用if let语句来简化模式匹配的代码。例如:

let x = Some(5);if let Some(n) = x {println!("The value is {}", n);
}

在这个示例中,我们只需要匹配Some类型的值,而不需要处理None类型的值。因此,使用if let语句可以让代码更加简洁和清晰。

match语句是Rust中非常强大的语言特性,它可以让我们根据不同的匹配模式执行不同的代码。在本教程中,我们介绍了 match 语句的基础用法、进阶用法和实践经验等方面的内容。通过学习本教程,相信读者可以掌握match语句的基本用法,并能够在实际开发中灵活运用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins打包,发布,部署

一、概念 Jenkins是一个开源的持续集成工具&#xff0c;主要用于自动构建和测试软件项目&#xff0c;以及监控外部任务的运行。与版本管理工具&#xff08;如SVN&#xff0c;GIT&#xff09;和构建工具&#xff08;如Maven&#xff0c;Ant&#xff0c;Gradle&#xff09;结合使…

Android Studio实现安卓心理健康咨询

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目代号161 1.开发环境 android stuido3.6 jdk1.8 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.心理测评 3.测评结果 4.心理咨询预约 5.心理综合辅导 6.个人中心 7.历史咨…

知识图谱入门——11:构建动态图谱渲染应用:Vue3与Neo4j的集成与实践

在知识图谱与大数据技术领域&#xff0c;构建动态图谱是一项非常重要的任务。这篇博客将带你深入了解如何利用Vue.js、D3.js以及Neo4j&#xff0c;开发一个能够实时渲染图谱节点和关系的应用。我们将从零开始&#xff0c;介绍如何搭建开发环境、安装依赖、与Neo4j数据库交互、到…

考研笔记之操作系统(三)- 存储管理

操作系统&#xff08;三&#xff09;- 存储管理 1. 内存的基础知识1.1 存储单元与内存地址1.2 按字节编址和按字编址1.3 指令1.4 物理地址和逻辑地址1.5 从写程序到程序运行1.6 链接1.6.1 静态链接1.6.2 装入时动态链接1.6.3 运行时动态链接 1.7 装入1.7.1 概念1.7.2 绝对装入1…

分支预测器BPU

分支预测器BPU 0 Intro0.1 CPU执行过程0.2 分支预测0.2.1 TAGE预测器0.2.2 跳转地址 分支预测器BPU是深入研究一个高性能处理器的一个很好的开始项目&#xff1b; 0 Intro 条件分支是指后续具有两路可执行的分支。可以分为跳转分支(taken branch)和不跳转分支(not-taken branc…

ES创建文档,使用postman调用请求

请求的url 地址是http://192.168.1.108:9200/shopping/_doc&#xff0c;请求方式为post, 请求参数为: { "title":"小米手机", "category":"小米", "images":"http://www.gulixueyuan.com/xm.jpg", "price&…

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

目录 一、问题描述二、问题原因2.1 理论角度2.2 源码角度 三、解决方案解决方案①&#xff1a;StringBuilder 拼接解决方案②&#xff1a;读取文件内容 四、方案验证 在线文本换行工具&#xff1a; https://lzltool.cn/Toolkit/WrapWordsInText 一、问题描述 今天在开发过程中…

CPU、GPU、显卡

CPU VS GPUCPU&#xff08;Central Processing Unit&#xff09;&#xff0c;中央处理器GPU&#xff08;Graphics Processing Unit&#xff09;&#xff0c;图形处理单元GPU 的技术演变CUDA&#xff08;Compute Unified Device Architecture&#xff09; 显卡&#xff08;Video…

016 规格参数

文章目录 新增AttrController.javaAttrVo.javaAttrServiceImpl.javaAttrAttrgroupRelationEntity.javaAttrEntity.javaAttrGroupEntity.java 查询AttrController.javaAttrServiceImpl.javaAttrRespVo.java 修改回显AttrController.javaAttrServiceImpl.java 修改提交AttrContro…

Word 插入表格的具体步骤图解

Word 是工作和学习中比较常用的软件之一&#xff0c;有时候在使用的过程中可能需要插入一个表格来整理一些数据&#xff0c;但是有的人可能不知道如何插入表格&#xff0c;下面就给大家总结了 Word 怎么插入表格。 Word 插入表格 Word 插入表格之后可以在里面填写数据和文本&…

时序约束进阶四:set_input_delay和set_output_delay详解

目录 一、前言 二、set_input_delay/set_output_delay 2.1 延时约束 2.2 约束设置界面 2.3 示例工程 2.4 Delay Value 2.5 Delay value is relative to clock edge 2.6 Delay value already includes latencies of the specified clock edge 2.7 Rise/Fall 2.8 Max/M…

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

使用IOT-Tree Server制作一个边缘计算设备(Arm Linux)

最近实现了一个小项目&#xff0c;现场有多个不同厂家的设备&#xff0c;用户需要对此进行简单的整合&#xff0c;并实现一些联动控制。 我使用了IOT-Tree Server这个软件轻松实现了&#xff0c;不外乎有如下过程&#xff1a; 1&#xff09;使用Modbus协议对接现有设备&#…

9-贪心算法

PDF文档下载&#xff1a;LeetCode-贪心算法-java 参考&#xff1a;代码随想录 题目分类大纲如下&#xff1a; 贪心算法理论基础 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心的套路&#xff08;什么时候用贪心&#xff…

C++ STL容器(五) —— priority_queue 底层剖析

这篇来讲下 priority_queue&#xff0c;其属于 STL 的容器适配器&#xff0c;容器适配器是在已有容器的基础上修改活泼限制某些数据接口以适应更特定的需求&#xff0c;比如 stack 栈使数据满足后进先出&#xff0c;queue 队列使数据满足先进先出&#xff0c;其都是在已有容器上…

转型AI产品经理需要掌握的硬知识、经理能力模型和常见AI概念梳理

近几年&#xff0c;从亚马逊&#xff0c; Facebook&#xff0c;到谷歌&#xff0c;微软&#xff0c;再到国内的BAT&#xff0c;全球最具影响力的技术公司都将目光转向了人工智能&#xff08; AI &#xff09;。2016年 AlphaGo 战胜李世石&#xff0c;把公众的目光也聚集到了人工…

哪些因素会影响PMC对生产质量问题的响应速度?

在制造业中&#xff0c;生产物料控制&#xff08;PMC&#xff09;扮演着至关重要的角色&#xff0c;它负责协调生产计划、物料采购、库存管理和生产进度等多个环节&#xff0c;确保生产活动能够顺利进行。然而&#xff0c;面对生产过程中可能出现的各种质量问题&#xff0c;PMC…

详解 PDF 转 JPG:简单操作,高效转换

如今&#xff0c;众多软件都已具备将PDF转换为JPG的功能&#xff0c;所以pdf怎么转换成jpg图片已经不难解决了吧。接下来&#xff0c;我想分享几款依然保存在我电脑中&#xff0c;且非常实用的PDF转JPG工具给大家。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn…

C语言基础之结构体

今天我们来讲讲C语言基础的最后一个知识点了 —— 结构体。不知道大家对前面的C语言基础的知识点掌握的怎么样了呢&#xff1f;下面我们就开始讲解结构体的相关知识点吧&#xff01; 什么是结构体呢&#xff1f;或者说结构体有什么作用呢&#xff1f;对于复杂对象来说&#xff…

盘点2024年4款打工人都在用的PDF软件。

PDF 软件在现代的办公或者是学习当中的应用非常广泛&#xff0c;已经成了很多人的必备工具。因为PDF 文件具有跨设备、跨系统的优势&#xff0c;所以在很多设备上都可以打开浏览。如果有了PDF 编辑软件&#xff0c;查看&#xff0c;编辑&#xff0c;分享也会变得更加方便简单&a…