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.xdnf.cn/news/1558113.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【微服务】—SpringBoot入门

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 文章目录 1 SpringBoot快速入门1.1 SpringBoot简介1.1.1 简介1.1.2…

Python | Leetcode Python题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; class Solution:def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool:cachedef dfs(usedNumbers: int, currentTotal: int) -> bool:for i in range(maxChoosableInteger):if (usedNumbers >> i) & 1…

音频剪辑在线工具 —— 让声音更精彩

你是否曾梦想过拥有自己的声音创作空间&#xff0c;却苦于复杂的音频编辑软件&#xff1f;接下来&#xff0c;让我们一同揭开这些音频剪辑在线工具的神秘面纱&#xff0c;看看它们如何帮助你实现从录音到发布的无缝衔接。 1.福昕音频剪辑 链接直达>>https://www.foxits…

55页可编辑PPT | 制造企业数字化转型顶层规划案例

基于集团的战略和运营特点&#xff0c;数字化转型应如何考虑&#xff1f; 在集团的战略和运营特点基础上进行数字化转型&#xff0c;需要实现业务多元化&#xff0c;整合资源和流程&#xff0c;推动国际化拓展&#xff0c;实施差异化战略&#xff0c;并通过数据驱动决策&#…

基于SpringBoot在线拍卖系统【附源码】

基于SpringBoot在线拍卖系统 效果如下&#xff1a; 网站首页界面 用户登录界面 竞拍商品界面 管理员登录界面 管理员功能界图 竞拍商品界面 系统界面 订单界面 研究背景 随着社会的发展&#xff0c;信息化时代带来了各行各业的变革。电子商务已成为人们日常生活不可或缺的一…

单片机教案 2.1 ATmega2560单片机最小应用系统

第二章 ATmega2560单片机I/O输入输出口简单应用 ATmega2560是一款基于AVR微控制器的高性能、低功耗的8位微处理器&#xff0c;广泛应用于嵌入式系统设计&#xff0c;尤其是Arduino Mega 2560开发板中。其拥有丰富的I/O资源和强大的处理能力&#xff0c;适用于各种电子项目&…

深入理解Transformer的笔记记录(非小白贴)NNLM → Word2Vec

文章的整体介绍顺序为&#xff1a; NNLM → Word2Vec → Seq2Seq → Seq2Seq with Attention → Transformer → Elmo → GPT → BERT 自然语言处理相关任务中要将自然语言交给机器学习中的算法来处理&#xff0c;通常需要将语言数学化&#xff0c;因为计算机机器只认数学符号…

知识改变命运 数据结构【java对象的比较】

0&#xff1a;前言 在基本数据类型中&#xff0c;我们可以直接使用号比较是否相等&#xff0c;还记的学堆哪里时候&#xff0c;插入一个数据&#xff0c;就会与其他数据进行比较&#xff0c;当时我们传入的是Integer类型&#xff0c;在Integer类里面已经实现了compare。 如果…

Java | Leetcode Java题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; class Solution {Map<Integer, Boolean> memo new HashMap<Integer, Boolean>();public boolean canIWin(int maxChoosableInteger, int desiredTotal) {if ((1 maxChoosableInteger) * (maxChoosableInteger) / 2 < desi…

【万字长文】Word2Vec计算详解(一)

【万字长文】Word2Vec计算详解&#xff08;一&#xff09; 写在前面 本文用于记录本人学习NLP过程中&#xff0c;学习Word2Vec部分时的详细过程&#xff0c;本文与本人写的其他文章一样&#xff0c;旨在给出Word2Vec模型中的详细计算过程&#xff0c;包括每个模块的计算过程&a…

宠物咖啡馆平台:SpringBoot框架的设计与实现

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【Vue3 + TS + Vite】从0到1搭建后台管理系统

前言 没搭建过Vue3的项目&#xff0c;从0开始搭建一下&#xff0c;记录一下自己的步骤。 技术栈&#xff1a; vue3 ts scss pinia vite 我尽量写的详细一些&#xff0c;后续也会记录我在项目过程中&#xff0c;遇到的一些问题。 文章目录 前言环境搭建一、创建项目1. 使用…

车载超声波雷达

车载超声波雷达 法雷奥同致电子BOSCH豪恩汽电辉创海康威视珠海上富晟泰克 法雷奥 法雷奥集团&#xff08;Valeo&#xff09;是一家总部位于法国的专业致力于汽车零部件、系统、模块的设计、开发、生产及销售的工业集团。公司业务涉及原配套业务及售后业务&#xff0c;是世界领…

有点晕,inline, crossinline,noinline小计

inline 主要用于展开铺平函数&#xff0c;用于高频访问但是代码不是很多的方法&#xff0c;减少函数对象的定义 fun <T> List<T>.normalForeach(action:(T)->Unit){for(item in this){action(item)} }inline fun <T> List<T>.inlinedForeach(action…

wildcard使用教程,解决绝大多数普通人的海外支付难题

许多人可能已经注意到,国外的一些先进AI工具对国内用户并不开放。而想要使用这些工具,我们通常会面临两个主要障碍:一是网络访问的限制,二是支付问题。网络问题很容易解决&#xff0c;难的是如何解决在国内充值海外软件。 今天给大家推荐一个工具——wildcard&#xff0c;用它…

MISC - 第13天(python脚本 重命名文件,拼接二维码,cloacked-pixel工具,中文电码,五笔编码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解MISC的相关知识 [安洵杯 2019]吹着贝斯扫二维码 附件信息: 使用APCHPR暴力破解工具&#xff0c;flag.zip 破解失败可能线索在其他文件&#xff0c;放到hxd查看 在hxd中&#xff0c;发现该文件头JFIF 是j…

HUAWEI_HCIA_实验指南_Lib1.4_配置通过Telnet登录系统

一、原理概述 Telnet(Telecommunication Network Protocol)起源于ARPANET,是最早的Internet应用之一。 Telnet 通常用在远程登录应用中&#xff0c;以便对本地或远端运行的网络设备进行配置、监控和维护。如网络中有多台设备需要配置和管理&#xff0c;用户无需为每一台设备…

多模态方法总结

多模态方法总结 架构分为Transformer Encoder的方法和基于Transformer Encoder和Decoder的方法 Transfomer Encoder方法 这张图来源于VILT&#xff0c;基本概括了多模态领域的模型架构。 图a是VSE或VSE的架构&#xff0c;文本端进行一个轻量的word embedding&#xff0c;视觉…

交易所开发:构建安全、高效、可靠的数字资产交易平台

数字资产交易平台是加密市场中连接用户与数字货币的重要枢纽。开发一个安全、高效、可靠的交易所&#xff0c;不仅需要综合考虑技术架构、安全策略、用户体验等方面&#xff0c;还需严格遵循法规要求以确保合规性。本文总结了交易所开发的关键要素&#xff0c;包括其类型、核心…

C++ static静态

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 用 static 修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成…