【Rust】——所有可能会用到模式的位置

💻博主现有专栏:

                C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,Python机器学习等
🥏主页链接:

                Y小夜-CSDN博客

目录

🎯match分支

🎯if let 条件表达式

🎯while let条件循环

🎯for循环

🎯let语句

🎯函数参数


🎯match分支

        一个模式常用的位置是 match 表达式的分支。在形式上 match 表达式由 match 关键字、用于匹配的值和一个或多个分支构成,这些分支包含一个模式和在值匹配分支的模式时运行的表达式:

match VALUE {PATTERN => EXPRESSION,PATTERN => EXPRESSION,PATTERN => EXPRESSION,
}
match x {None => None,Some(i) => Some(i + 1),
}

这个 match 表达式中的模式为每个箭头左边的 None 和 Some(i)

 match 表达式必须是 穷尽exhaustive)的,意为 match 表达式所有可能的值都必须被考虑到。一个确保覆盖每个可能值的方法是在最后一个分支使用捕获所有的模式:比如,一个匹配任何值的名称永远也不会失败,因此可以覆盖所有匹配剩下的情况。

🎯if let 条件表达式

        以前讨论过了 if let 表达式,以及它是如何主要用于编写等同于只关心一个情况的 match 语句简写的。if let 可以对应一个可选的带有代码的 else 在 if let 中的模式不匹配时运行。

        这相比 match 表达式一次只能将一个值与模式比较提供了更多灵活性。并且 Rust 并不要求一系列 if letelse ifelse if let 分支的条件相互关联。

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 直到大括号开始的新作用域才是有效的。

  if let 表达式的缺点在于其穷尽性没有为编译器所检查,而 match 表达式则检查了。如果去掉最后的 else 块而遗漏处理一些情况,编译器也不会警告这类可能的逻辑错误。

🎯while let条件循环

它使用 vector 作为栈并以先进后出的方式打印出 vector 中的值:

    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 方法取出 vector 的最后一个元素并返回 Some(value)。如果 vector 是空的,它返回 Nonewhile 循环只要 pop 返回 Some 就会一直运行其块中的代码。一旦其返回 Nonewhile 循环停止。我们可以使用 while let 来弹出栈中的每一个元素。

🎯for循环

在 for 循环中,模式是 for 关键字直接跟随的值,正如 for x in y 中的 x

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

会打印:

$ cargo runCompiling patterns v0.1.0 (file:///projects/patterns)Finished dev [unoptimized + debuginfo] target(s) in 0.52sRunning `target/debug/patterns`
a is at index 0
b is at index 1
c is at index 2

🎯let语句

        在本章之前,我们只明确的讨论过通过 match 和 if let 使用模式,不过事实上也在别的地方使用过模式,包括 let 语句。例如,考虑一下这个直白的 let 变量赋值:

let x = 5;

        不过你可能没有发觉,每一次像这样使用 let 语句就是在使用模式!let 语句更为正式的样子如下:

let PATTERN = EXPRESSION;

        像 let x = 5; 这样的语句中变量名位于 PATTERN 位置,变量名不过是形式特别朴素的模式。我们将表达式与模式比较,并为任何找到的名称赋值。所以例如 let x = 5; 的情况,x 是一个代表 “将匹配到的值绑定到变量 x” 的模式。同时因为名称 x 是整个模式,这个模式实际上等于 “将任何值绑定到变量 x,不管值是什么”。

        为了更清楚的理解 let 的模式匹配方面的内容,考虑示例 18-4 中使用 let 和模式解构一个元组:

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

        这里将一个元组与模式匹配。Rust 会比较值 (1, 2, 3) 与模式 (x, y, z) 并发现此值匹配这个模式。在这个例子中,将会把 1 绑定到 x2 绑定到 y 并将 3 绑定到 z。你可以将这个元组模式看作是将三个独立的变量模式结合在一起。

        如果模式中元素的数量不匹配元组中元素的数量,则整个类型不匹配,并会得到一个编译时错误。

    let (x, y) = (1, 2, 3);

尝试编译这段代码会给出如下类型错误:

$ cargo runCompiling patterns v0.1.0 (file:///projects/patterns)
error[E0308]: mismatched types--> src/main.rs:2:9|
2 |     let (x, y) = (1, 2, 3);|         ^^^^^^   --------- this expression has type `({integer}, {integer}, {integer})`|         ||         expected a tuple with 3 elements, found one with 2 elements|= note: expected tuple `({integer}, {integer}, {integer})`found tuple `(_, _)`For more information about this error, try `rustc --explain E0308`.
error: could not compile `patterns` due to previous error

为了修复这个错误,可以使用 _ 或 .. 来忽略元组中一个或多个值

🎯函数参数

它获取一个 i32 类型的参数 x,现在这看起来应该很熟悉:

fn foo(x: i32) {// code goes here
}

x 部分就是一个模式!类似于之前对 let 所做的,可以在函数参数中匹配元组。

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

        这会打印出 Current location: (3, 5)。值 &(3, 5) 会匹配模式 &(x, y),如此 x 得到了值 3,而 y得到了值 5

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

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

相关文章

【XML模版文件参数初始化】

XML 模版文件&#xff0c;内部存在需要自定义的数据&#xff0c;使用 Python 进行初始化。 1、存在一个 XML 模版文件&#xff0c;定义如下 <!-- 文件名称 index.xml --> <root><HEAD><VER>1.0</VER><SRC>10000000000000</SRC><…

mediasoup源码分析(四)channel返回信令及notify通知

channel返回信令及notify通知 前言正常成功返回Accept异常失败返回Rejectmediasoup主动推送&#xff0c;Emitmediasoup推送数据到信令服务的具体实现:tips 前言 在mediasoup源码分析(三)channel创建及信令交互一文中介绍了mediasoup中channel的创建&#xff0c;接下来在本文中…

拼多多面试总结

文章目录 一面自我介绍提问算法反问结果 二面提问算法反问结果 主管面主管面试准备算法题其他个人提问准备 提问数据库普通索引和覆盖索引的区别索引是什么&#xff1f;索引怎么加快数据库查询的&#xff1f;索引具体怎么实现的&#xff1f;以B树为例&#xff0c;节点放了什么&…

自动预约申购 i茅台工具完善

自动预约申购茅台工具 概述新的改变界面预览 概述 今天刷到一个windows自动刷茅台的工具&#xff0c;是用wpf实现的&#xff0c;看到作者最后是2023年更新的&#xff0c;评论中有好多人提出一些需求&#xff0c;刚才在学习wpf&#xff0c;就试着完善了一下。 工具下载&#x…

【C++】文件处理(IO流)

文章目录 C IO流1. C语言IO2. CIO2.1 C标准IO流2.2 C文件IO流2.3 C IO 文件常用函数总结表2.4 C stringstream C IO流 回顾一下&#xff0c;C语言中IO输入输出的 1. C语言IO C语言中常用的输入输出函数有如下几种&#xff1a;前者是格式化标准输入输出&#xff0c;后者是格式化…

C语言——结构体指针

观察下述代码&#xff1a; typedef struct student {char* name; //可以存char *a “hellow world”; 可以当一个字符串 他的地址是第一个字母hint age; int (*init)(void);//一个指向无参数、返回类型为int的函数的指针。后面需要用到就成员名点方法struct student* classma…

windows和linux下清空Redis

前言 在本文中&#xff0c;我们将详尽阐述在Windows与Linux操作系统中有效清除Redis缓存的实践方法&#xff0c;旨在为您提供清晰、高效的指导流程&#xff0c;确保数据管理的灵活性与效率。 windows下推荐两款可视化工具 Another Redis Desktop Manager 这是我用的最多也是最…

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展&#xff1a;人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点&#xff1a;数据的管理者&#xff08;DBMS&#xff09;&#xff1b;数据结构化&#xff1b;数据共享性高&#xff0c;冗余度低&#xff0c;易于扩充&#xff…

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中&#xff0c;数据载体是一个较为重要组成部分&#xff0c;ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是&#xff0c;这些…

从移动切换到电信IP:详细介绍两种方法

在当前的互联网环境中&#xff0c;用户可能会因为各种原因需要切换网络服务提供商&#xff0c;比如从移动切换到电信。这种切换不仅涉及到网络服务的变更&#xff0c;还可能意味着IP地址的改变。那么&#xff0c;移动的怎么切换成电信的IP&#xff1f;下面一起来了解一下吧。 方…

测试内容初步认知

测试流程 了解需求--需求评审--编写测试用例--测试用例评审(产品、开发、测试)--提测测试--bug管理(devops)--集成--集成回归--发布灰度包测试(灰度周期一周)----编写测试报告--发布上线 测试岗位划分 功能测试 负责编写测试用例&#xff0c;执行手动测试&#xff0c;记录并…

麦肯锡:量子传感究竟在何处可以发光发热

量子传感技术已经提供价值&#xff0c;潜在的应用案例可以塑造多个行业。有四种核心技术具有应用前景&#xff1a;固态自旋、中性原子、超导电路和离子阱&#xff0c;它们具有在广泛的物理属性上的传感能力&#xff0c;包括磁场、电场、旋转、温度、重力、时间和压力。选择哪种…

一网通办怎么办?一网统管怎么管?

一网通办怎么办?一网统管怎么管? 下面资源来源于网络,如有侵权请联络删除! **一网通办与一网统管的建设背景、建设情况及建设意义** 一、建设背景随着信息技术的飞速发展,传统的政务服务方式已难以满足人民群众日益增长的需求。各部门信息系统独立运行,导致信息孤岛现象…

Android Service功能使用

在Android开发中&#xff0c;Service是一个在后台长时间运行的组件&#xff0c;不会提供用户界面。它可以用来处理一些需要在后台进行的操作&#xff0c;比如播放音乐、下载文件或进行网络请求。本文将介绍如何在Kotlin中使用Service&#xff0c;并包含具体的代码示例。 什么是…

Python自动化(6)——图像模块

本文所述的方法都是基于前几章的后台点击&#xff0c;因此同样需要绑定窗口句柄。 Python自动化(6)——图像模块 识色 定点比色 def cv2CompareColorOneMatch(self, x, y, hexColor, _similar0, borderNone):startX 0startY 0similar _similar self.colorOffsetif bord…

Spring AOP架构设计解析

一、AOP&#xff08;Aspect Oriented Programming&#xff09;Aspect&#xff1a;方面/层面&#xff1b;Oriented&#xff1a;朝向 1、面向方面&#xff08;切面&#xff09;编程 2、Spring基于代理实现AOP 3、业务作用类似于过滤器&#xff0c;比过滤器强大 二、AOP实现方…

基于Java协同过滤算法的电影推荐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

Kotlin 中的解构

解构声明是 Kotlin 语言的一个特性&#xff0c;它允许我们从一个数据结构中提取多个变量&#xff0c;这样可以让我们的代码更加简洁易读&#xff0c;同时也提高了代码的可维护性。 在 Kotlin 中&#xff0c;解构可以用于多种数据类型&#xff0c;例如&#xff0c;列表&#xf…

vue3文件目录解析

Vue3 的文件目录结构在构建单页面应用时起到了至关重要的作用&#xff0c;其结构清晰、模块化设计有助于提高代码的可读性、可维护性和可重用性。以下是 Vue3 文件目录的详细解析&#xff1a; 根目录&#xff1a; 包含 Vue3 项目的所有主要文件和文件夹。node_modules&#xf…

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子&#xff0c;介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm1001.2014.3001.5501文章浏览阅读323次&#xff0c;点赞4次&#xff0c;收藏2次。搞3D几何内核算法研究&#xff0c;必须学习NURBS样条曲线…