Rust 9.2 Patterns and Matching

Rust学习笔记

Rust编程语言入门教程课程笔记

参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community)

Lecture 18: Patterns and Matching

src/main.rs

fn main() {//match arms// match VALUE {//     PATTERN => EXPRESSION,//     PATTERN => EXPRESSION,//     PATTERN => EXPRESSION,//     _ => EXPRESSION,// }let x = 1;match x {1 => println!("one"),2 => println!("two"),3 => println!("three"),_ => println!("anything"),}//if let//else if//else if letlet 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 {//use the shadowed age variableif 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");} //while letlet mut stack = Vec::new();stack.push(1);stack.push(2);stack.push(3);while let Some(top) = stack.pop(){println!("{}", top);}//for loopslet v = vec!['a', 'b', 'c'];for (index, value) in v.iter().enumerate(){println!("{} is at index {}", value, index);}//let statements//let Pattern = Expression;let (x, y, z) = (1, 2, 3);//function parametersfoo(3);let point = (3, 5);print_coordinates(&point);//Refutability: Whether a Pattern Might Fail to Matchlet some_option_value: Option<i32> = None;// let Some(x) = some_option_value; //error: refutable pattern in local binding: `None` not coveredif let Some(x) = some_option_value {println!("{}", x);}//Pattern Syntax//Matching Named Variableslet x = Some(5);let y = 10;match x {Some(50) => println!("Got 50"),Some(y) => println!("Matched, y = {y}"),_ => println!("Default case, x = {:?}", x),}println!("at the end: x = {:?}, y = {}", x, y);//x = Some(5), y = 10//Multiple Patternslet x = 1;match x {1 | 2 => println!("one or two"),3 => println!("three"),_ => println!("anything"),}//Matching Ranges of Values with ...let x = 5;match x {1..=5 => println!("one through five"),_ => println!("something else"),}let x = 'c';match x {'a'..='j' => println!("early ASCII letter"),'k'..='z' => println!("late ASCII letter"),_ => println!("something else"),}//Destructuring to Break Apart Valueslet p = Point { x: 0, y: 7 };let Point { x: a, y: b } = p; //let Point { x, y } = p;assert_eq!(0, a);assert_eq!(7, b);match p {Point { x, y: 0 } => println!("On the x axis at {x}"),Point { x: 0, y } => println!("On the y axis at {y}"),Point { x, y } => {println!("On neither axis: ({x}, {y})");}}//Destructuring Enumslet msg = Message::ChangeColor(0, 160, 255);match msg {Message::Quit => {println!("The Quit variant has no data to destructure.");}Message::Move { x, y } => {println!("Move in the x direction {x} and in the y direction {y}");}Message::Write(text) => {println!("Text message: {text}");}Message::ChangeColor(r, g, b) => {println!("Change the color to red {r}, green {g}, and blue {b}",)}}//Destructuring Nested Structs and Enumslet msg = Message3::ChangeColor(Color::Hsv(0, 160, 255));match msg {Message3::ChangeColor(Color::Rgb(r, g, b)) => {println!("Change color to red {r}, green {g}, and blue {b}");}Message3::ChangeColor(Color::Hsv(h, s, v)) => {println!("Change color to hue {h}, saturation {s}, value {v}")}_ => (),}//Destructuring Structs and Tupleslet ((feet, inches), Point { x, y }) = ((3, 10), Point { x: 3, y: -10 });//Ignoring Values in a Patternfoo2(3, 4);//Ignoring Parts of a Value with a Nested _let mut setting_value = Some(5);let new_setting_value = Some(10);match (setting_value, new_setting_value) {(Some(_), Some(_)) => {println!("Can't overwrite an existing customized value");}_ => {setting_value = new_setting_value;}}println!("setting is {:?}", setting_value);let numbers = (2, 4, 8, 16, 32);match numbers {(first, _, third, _, fifth) => {println!("Some numbers: {first}, {third}, {fifth}")}}//Ignoring an Unused Variable by Starting Its Name with _let _x = 5;let y = 10;println!("{}", y);let s = Some(String::from("Hello!"));//if let Some(_s) = s {//    println!("found a string");//}//println!("{:?}", s);if let Some(_) = s {println!("found a string");}println!("{:?}", s);//Ignoring Remaining Parts of a Value with ..let origin = Point2 { x: 0, y: 0, z: 0 };match origin {Point2 { x, .. } => println!("x is {}", x),}let numbers = (2, 4, 8, 16, 32);match numbers {(first, .., last) => {println!("Some numbers: {first}, {last}");}}//match numbers {//     (.., second, ..) => { //error: It’s impossible for Rust to determine how many values in the tuple to ignore before matching a value with second and then how many further values to ignore thereafter.//         println!("Some numbers: {}", second)//     },// }//Extra Conditionals with Match Guardslet num = Some(4);match num {Some(x) if x % 2 == 0 => println!("The number {} is even", x),Some(x) => println!("The number {} is odd", x),None => (),}let x = Some(5);let y = 10;match x {Some(50) => println!("Got 50"),Some(n) if n == y => println!("Matched, n = {n}"),_ => println!("Default case, x = {:?}", x),}println!("at the end: x = {:?}, y = {y}", x);let x = 4;let y = false;match x {4 | 5 | 6 if y => println!("yes"),_ => println!("no"),}// @ Bindingsenum Message2 {Hello { id: i32 },}let msg = Message2::Hello { id: 5 };match msg {Message2::Hello {id: id_variable @ 3..=7,} => println!("Found an id in range: {id_variable}"),Message2::Hello { id: 10..=12 } => {println!("Found an id in another range")}Message2::Hello { id } => println!("Found some other id: {id}"),}
}struct Point {x: i32,y: i32,
}struct Point2 {x: i32,y: i32,z: i32,
}enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}enum Message3 {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(Color),
}enum Color {Rgb(i32, i32, i32),Hsv(i32, i32, i32),
}fn foo(x: i32) {// code goes here
}fn foo2(_: i32, y: i32) {println!("This code only uses the y parameter: {}", y);
}fn print_coordinates(&(x, y): &(i32, i32)) {println!("Current location: ({}, {})", x, y);
}

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

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

相关文章

C/C++结构体给函数传参

C语言中结构体给函数传参有两种方法&#xff1a; 1.值传递&#xff08;修改形参不改变原值&#xff09; void fun(STUDENT student){……} int main(){fun(student); }2.引用传递&#xff08;传的是地址&#xff0c;修改形参会改变原值&#xff09; void fun(STUDENT * stud…

FPGA语法相关知识合集

一.相关概念 1.四种结构说明语句 2.initial 与 always 的异同点 3.task 与 function 的3个不同点 4.task的语法结构(定义及调用) 5.function的语法结构(定义及调用) 6.function 的一个必须有和一个必须没有&#xff0c;使用规则 7.自动&#xff08;递归&#xff09;函数…

2023亚太地区数学建模A题思路分析+模型+代码+论文

目录 2023亚太地区数学建模A题思路&#xff1a;开赛后第一时间更新&#xff0c;获取见文末名片 2023亚太地区数学建模B题思路&#xff1a;开赛后第一时间更新&#xff0c;获取见文末名片 2023亚太地区数学建模C题思路&#xff1a;开赛后第一时间更新&#xff0c;获取见文末名…

听说90%的人都没搞定手撕协程池这道面试题!

特别的缘分 听说90%的人都没搞定手撕协程池这道面试题&#xff01; 能看到这篇文章一定是特殊的缘分&#xff0c;请务必珍惜&#xff0c;请详细看看吧&#xff0c;哈哈。 不止上图&#xff0c;最近 Go就业训练营 中不少小伙伴说&#xff0c;面试中碰到了好几次手撕协程池的问题…

linux(nginx安装配置,tomcat服务命令操作)

首先进系统文件夹 /usr/lib/systemd/systemLs | grep mysql 查看带有命名有MySQL的文件夹修改tomcat.service文件复制jdk目录替换成我们的路径替换成我们的路径进入这个目录&#xff0c;把修改好的文件拖到我们的工具里面重新刷新系统 systemctl daemon-reload查看tomcat状态…

C语言获取win11新版终端WindowsTerminal窗口句柄

随着Win11的普及&#xff0c;越来越多的人都能发现获取控制台窗口不能再使用以下两种传统方法了&#xff1a; HWND hwnd GetConsoleWindow();HWND hwnd FindWindowA("ConsoleWindowClass",NULL);那是因为win11换了新的终端窗口&#xff0c;叫做WindowsTerminal&am…

web自动化测试十大问题+解决方法汇总,一篇概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、启动浏览器报错…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)

基于ARM语音识别的智能家居系统 我们上一篇&#xff0c;我们实现在Linux系统下编译程序&#xff0c;我们首先通过两个小练习来熟悉一下如何去编译。今天&#xff0c;我们来介绍一下LCD屏幕基本使用。 一、LCD屏幕基本使用 如何使用LCD屏幕&#xff1f; 1、打开开发板LCD设…

NLP学习

参考&#xff1a;NLP发展之路I - 从词袋模型到Transformer - 知乎 (zhihu.com) NLP大致的发展历史。从最开始的词袋模型&#xff0c;到RNN&#xff0c;到Transformers和BERT&#xff0c;再到ChatGPT&#xff0c;NLP经历了一段不断精进的发展道路。数据驱动和不断完善的端到端的…

构建ansible学习环境

1.设置主机名 命名命令:hostnamectl set-hostname xx 设置4台主机 servera serverb serverc serverd 2.配置扩展源 1)cd /etc/yum.reops.d/ 2)vim local.repo [biaoshi] namemiaoshu baseurl/mnt/BaseOS enable1 gpgcheck0 [biaoshi2] namemi…

uniapp 打包后各静态资源加载失败的问题(背景图,字体等)

原因: 1.部署地址不在域名根目录下 解决办法(推荐办法2): 办法1.如果部署在域名的文件夹下(例如h5), 则运行的基础路径修改为/h5/ 且注意路由模式 办法2.不修改运行的基础路径(还是./), 将代码中涉及背景图(background-image)和字体资源的路径前统一加,如图:

【giszz笔记】产品设计标准流程【合集】【1.79 万字】

Tips&#xff1a;原笔记共8篇&#xff0c;本文是合集&#xff0c;字数较多&#xff0c;可收藏或关注。 目录 一、普通产品打造的流程 二、更标准一点的产品打造过程&#xff08;十一步&#xff09; &#xff08;一&#xff09;制定工作计划 &#xff08;二&#xff09;用户…

65道常问前端面试题总结react

面试题总结 一.Axios的实现原理 Axios 是一个基于 Promise 的 HTTP 客户端库&#xff0c;用于浏览器和 Node.js 环境。它可以发送 HTTP 请求并处理响应数据。下面是 Axios 实现的基本原理&#xff1a; 封装请求&#xff1a;Axios 提供了一个简单易用的 API&#xff0c;使得开…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 系列文章(目录)

系列文章目录 第一章 技术栈简介 (开篇) 第二章 环境部署 (Node等环境安装) 第三章 项目创建 (Vite项目初始化) 第四章 认识项目目录 (项目整体介绍) 第五章 组件库安装和使用(Element-Plus基础配置) 第六章 样式格式化 (Sass配置) 第七章 路由配置 (vue-router深入解读) 第八…

向上转型 向下转型 重写 多态 ---java

目录 一. 向上转型 1.1 概念 1.2 语法格式 1.3 动态绑定引入 1.4 重写的引入 1.5向上转型的使用方式 方式一: 直接赋值 方式二: 通过传参,进行向上转型(多态引入) 方法三:通过返回值, 进行向上转型 二. 重写 2.1 概念 2.2 重写的格式 2.3 重写的规则 【重写和重…

如何最大化客户生命周期价值?APMDR 模型在袋鼠云的落地实践

相信大家都认可一个观点&#xff1a;不论是 To B 还是 To C&#xff0c;用户是企业的核心资源&#xff0c;是互联网产品中最重要的价值之一。因此&#xff0c;深入挖掘用户价值成为现在大部分企业运营的关键。 之前我们为大家介绍过如何利用 RFM 模型让企业聚焦于更有价值的用…

数据分层:打造数据资产管家

一、引言 随着企业数据规模的增长&#xff0c;数据的价值变得越来越重要。然而&#xff0c;传统的数据库在承载大量数据时面临挑战&#xff0c;需要高效有序的维护。因此&#xff0c;建立高效的数据仓库成为了企业决策和管理的基石&#xff0c;但现代技术的背景下&#xff0c;…

动能方案 | 15693协议的读卡器应用 DP1363F 替代RC663

15693协议是一种高频&#xff08;13.56 MHz&#xff09;射频识别&#xff08;RFID&#xff09;协议&#xff0c;广泛满足无线识别和数据传输领域。其特点包括较远的读取范围、支持快速数据传输、与多个标签的兼容等&#xff0c;产生于不同行业有着广泛的应用&#xff0c;包括但…

【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界

在这个充满科技魅力的时代&#xff0c;我们可以通过各种方式去了解和探索自然界的奥秘。而昆虫作为地球上最为丰富多样的生物群体之一&#xff0c;其独特的生活习性和形态特征一直吸引着人们的目光。 由广州华锐互动开发的昆虫3D虚拟动态展示系统&#xff0c;成为了一种全新的科…

Java异常处理机制

Java异常处理机制 一、异常概述与异常体系结构异常概述Error示例代码&#xff1a;Exception示例代码&#xff1a;异常体系结构Error和Exception的区别:异常分类检查异常非检查异常Why:为什么有非检查异常&#xff1f;Where:非检查异常有哪些&#xff1f;Exception异常划分运行时…