【Rust练习】16.模式
文章题目来自:https://practice-zh.course.rs/pattern-match/patterns.html
1 🌟🌟 使用 | 可以匹配多个值, 而使用 …= 可以匹配一个闭区间的数值序列
fn main() {}
fn match_number(n: i32) {match n {// 匹配一个单独的值1 => println!("One!"),// 使用 `|` 填空,不要使用 `..` 或 `..=`__ => println!("match 2 -> 5"),// 匹配一个闭区间的数值序列6..=10 => {println!("match 6 -> 10")},_ => {println!("match 11 -> +infinite")}}
}
将前面学到的模式匹配进行集合就可以了
fn match_number(n: i32) {match n {// 匹配一个单独的值1 => println!("One!"),// 使用 `|` 填空,不要使用 `..` 或 `..=`2 | 3 | 4 | 5 => println!("match 2 -> 5"),// 匹配一个闭区间的数值序列6..=10 => {println!("match 6 -> 10")}others => {println!("match 11 -> +infinite")}}
}
2 🌟🌟🌟 @ 操作符可以让我们将一个与模式相匹配的值绑定到新的变量上
struct Point {x: i32,y: i32,
}fn main() {// 填空,让 p 匹配第二个分支let p = Point { x: __, y: __ };match p {Point { x, y: 0 } => println!("On the x axis at {}", x),// 第二个分支Point { x: 0..=5, y: y@ (10 | 20 | 30) } => println!("On the y axis at {}", y),Point { x, y } => println!("On neither axis: ({}, {})", x, y),}
}
这里的语法可能会让有些人非常疑惑:明明x和y就在这里,为什么我要再给y绑定一个变量?如果你直接编译上述代码(我指的是修改了p的赋值之后),你会遇到如下错误:

将y改成p.y就可以了。
我们先考虑另外一个场景:
fn age() -> u32 {15
}fn main() {println!("Tell me what type of person you are");match age() {0 => println!("I haven't celebrated my first birthday yet"),1..=12 => println!("I'm a child of age 1..12"),13..=19 => println!("I'm a teen of age 13..19"),_ => println!("I'm an old person of age others"),}
}
一个典型的根据年龄匹配打印的函数,那如果我希望将被匹配的值,也就是age()的返回值打印出来呢?这就不太好办了。也许可以在println!里再调用一次?你知道可以这么做只是因为这里age()返回的值是固定的,如果它每次返回的值都不一样,显然不能这么做。
这时,@绑定就派上用场了。
fn main() {println!("Tell me what type of person you are");match age() {0 => println!("I haven't celebrated my first birthday yet"),n @ 1..=12 => println!("I'm a child of age {:?}", n),n @ 13..=19 => println!("I'm a teen of age {:?}", n),n => println!("I'm an old person of age {:?}", n),}
}
我们将被匹配的值绑定到n上,后续代码逻辑就可以使用了。
再考虑上面的例子,归根结底,每次匹配都只是将外部的变量和范围进行匹配,中间没有产生任何额外的变量。所以如果你想使用,要么使用原始的外部变量,要么进行一个@绑定。而匹配所有值,本质上不是匹配,就是进行了一次绑定,所以绑定的值可以直接使用。
3
// 修复错误
enum Message {Hello { id: i32 },
}fn main() {let msg = Message::Hello { id: 5 };match msg {Message::Hello {id: 3..=7,} => println!("id 值的范围在 [3, 7] 之间: {}", id),Message::Hello { id: newid@10 | 11 | 12 } => {println!("id 值的范围在 [10, 12] 之间: {}", newid)}Message::Hello { id } => println!("Found some other id: {}", id),}
}
第一个需要用@绑定,第二个需要全部匹配(落个括号)
// 修复错误
enum Message {Hello { id: i32 },
}fn main() {let msg = Message::Hello { id: 5 };match msg {Message::Hello {id:id@ 3..=7,} => println!("id 值的范围在 [3, 7] 之间: {}", id),Message::Hello { id: newid@(10 | 11 | 12) } => {println!("id 值的范围在 [10, 12] 之间: {}", newid)}Message::Hello { id } => println!("Found some other id: {}", id),}
}
4 🌟🌟 匹配守卫(match guard)是一个位于 match 分支模式之后的额外 if 条件,它能为分支模式提供更进一步的匹配条件。
// 填空让代码工作,必须使用 `split`
fn main() {let num = Some(4);let split = 5;match num {Some(x) __ => assert!(x < split),Some(x) => assert!(x >= split),None => (),}
}
事实上就是多一个if条件,来进一步匹配而已。
fn main() {let num = Some(4);let split = 5;match num {Some(x) if x < split => assert!(x < split),Some(x) => assert!(x >= split),None => (),}
}
5 🌟🌟🌟 使用 … 忽略一部分值
// 填空,让代码工作
fn main() {let numbers = (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048);match numbers {__ => {assert_eq!(first, 2);assert_eq!(last, 2048);}}
}
可惜只能忽略一次
fn main() {let numbers = (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048);match numbers {(first, .., last) => {assert_eq!(first, 2);assert_eq!(last, 2048);}}
}
6 🌟🌟 使用模式 &mut V 去匹配一个可变引用时,你需要格外小心,因为匹配出来的 V 是一个值,而不是可变引用
// 修复错误,尽量少地修改代码
// 不要移除任何代码行
fn main() {let mut v = String::from("hello,");let r = &mut v;match r {&mut value => value.push_str(" world!") }
}
思来想去,也只有这一种改法了。
fn main() {let mut v = String::from("hello,");let r = &mut v;match r {value => value.push_str(" world!") }
}
r本身就是对string的可变引用,如果想直接使用的话,没必要再引用一次。按图中的匹配,最后value会是一个不可变string,这样后面的操作就做不到了。
相关文章:
【Rust练习】16.模式
文章题目来自:https://practice-zh.course.rs/pattern-match/patterns.html 1 🌟🌟 使用 | 可以匹配多个值, 而使用 … 可以匹配一个闭区间的数值序列 fn main() {} fn match_number(n: i32) {match n {// 匹配一个单独的值1 > println!(…...
深度学习(4):torch.nn.Module
文章目录 一、是什么二、nn.Module 的核心功能三、nn.Module 的基本用法1. 定义自定义模型2. 初始化模型3. 模型的使用 四、nn.Module 的关键特性1. 自动注册子模块和参数2. forward 方法3. 不需要定义反向传播 五、常用的内置模块六、示例:创建一个简单的神经网络1…...
(14)关于docker如何通过防火墙做策略限制
关于docker如何通过防火墙做策略限制 1、iptables相关问题 在Iptables防火墙中包含四种常见的表,分别是filter、nat、mangle、raw。 filter:负责过滤数据包。 filter表可以管理INPUT、OUTPUT、FORWARD链。 nat:用于网络地址转换。 nat表…...
新React开发人员应该如何思考
React是一个用于构建用户界面的流行JavaScript库,通过使开发人员能够创建可重用组件并有效管理复杂的UI,彻底改变了前端开发。然而,采用正确的心态对于新开发人员驾驭React独特的范式至关重要。让我们来探索塑造“React思维模式”的基本原则和…...
解密.bixi、.baxia勒索病毒:如何安全恢复被加密数据
导言 在数字化时代,数据安全已成为个人和企业面临的重大挑战之一。随着网络攻击手段的不断演进,勒索病毒的出现尤为引人关注。其中,.bixi、.baxia勒索病毒是一种新型的恶意软件,它通过加密用户的重要文件,迫使受害者支…...
开源 AI 智能名片与 S2B2C 商城小程序:嫁接权威实现信任与增长
摘要:本文探讨了嫁接权威在产品营销中的重要性,并结合开源 AI 智能名片与 S2B2C 商城小程序,阐述了如何通过与权威关联来建立客户信任,提升产品竞争力。强调了在当今商业环境中,巧妙运用嫁接权威的方法,能够…...
S-Clustr-Simple 飞机大战:骇入现实的建筑灯光游戏
项目地址:https://github.com/MartinxMax/S-Clustr/releases Video https://www.youtube.com/watch?vr3JIZY1olro 飞机大战 按键操作: ←:向左移动 →:向右移动 Space:发射子弹 这是一个影子集群的游戏插件,可以将游戏画面映射到现实的设备,允许恶…...
MySQL:存储引擎简介和库的基本操作
目录 一、存储引擎 1、什么是存储引擎? 2、存储引擎的分类 关系型数据库存储引擎: 非关系型数据库存储引擎: 分布式数据库存储引擎: 3、常用的存储引擎及优缺点 1、InnoDb存储引擎 2、MyISAM存储引擎 3、MEMORY存储引擎 …...
JavaScript类型判断(总结)
1. 使用typeof操作符 typeof操作符可以返回一个值的类型的字符串表示。例如: typeof 42; // "number" typeof "Hello"; // "string" typeof true; // "boolean" typeof undefined; // "undefined" typeof null…...
SpringBoot之登录校验关于JWT、Filter、interceptor、异常处理的使用
什么是登录校验? 所谓登录校验,指的是我们在服务器端接收到浏览器发送过来的请求之后,首先我们要对请求进行校验。先要校验一下用户登录了没有,如果用户已经登录了,就直接执行对应的业务操作就可以了;如果用…...
我的AI工具箱Tauri版-FunAsr音频转文本
本教程基于自研的AI工具箱Tauri版进行FunAsr音频转文本服务。 FunAsr音频转文本服务 是自研AI工具箱Tauri版中的一个高效模块,专为将音频或视频中的语音内容自动转化为文本或字幕而设计。用户只需简单配置输入、输出路径,即可通过FunAsr工具快速批量处理…...
C++:模版初阶
目录 一、泛型编程 二、函数模版 概念 格式 原理 实例化 模版参数的匹配原则 三、类模版 定义格式 实例化 一、泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swa…...
Python Web 与区块链集成的最佳实践:智能合约、DApp与安全
Python Web 与区块链集成的最佳实践:智能合约、DApp与安全 📚 目录 🏗 区块链基础 区块链的基础概念与应用场景使用 Web3.py 与 Python Web 应用集成区块链网络在 Web 应用中实现加密货币支付与转账功能 🔑 智能合约与 DApp 编写…...
使用工具将截图公式转换为word公式
引言: 公式越复杂,心情越凌乱,手写都会觉得很麻烦,何况敲到电脑里面呢,特别是在写论文时,word有专属的公式格式,十分繁杂,如果照着mathTYPE软件敲,那么会耗费很长的时间…...
深度学习(6):Dataset 和 DataLoader
文章目录 Dataset 类DataLoader 类 Dataset 类 概念: Dataset 是一个抽象类,用于表示数据集。它定义了如何获取数据集中的单个样本和标签。 作用: 为数据集提供统一的接口,便于数据的读取、预处理和管理。 关键方法ÿ…...
Qt窗口——QToolBar
文章目录 工具栏创建工具栏设置toolTip工具栏配合菜单栏工具栏浮动状态 工具栏 QToolBar工具栏是应用程序中集成各种功能实现快捷键使用的一个区域。 可以有多个,也可以没有。 创建工具栏 #include "mainwindow.h" #include "ui_mainwindow.h&qu…...
MySQL—存储过程详解
基本介绍 存储过程和函数是数据库中预先编译并存储的一组SQL语句集合。它们的主要目的是提高代码的复用性、减少数据传输、简化业务逻辑处理,并且一旦编译成功,可以永久有效。 存储过程和函数的好处 提高代码的复用性:存储过程和函数可以在…...
2024ICPC网络赛2记录:CK
这一次网络赛我们过8题,排名71,算是发挥的非常好的了。这一把我们三个人手感都很好,前六题都是一遍过,然后我又切掉了非签到的E和C,最后时间不是很多,K只想到大概字典树的思路,细节不是很懂就直…...
PerparedStatement概述
PreparedStatement 是 Java 中的一个接口,用于预编译 SQL 语句并执行数据库操作。 一、主要作用 提高性能: 数据库在首次执行预编译语句时会进行语法分析、优化等操作,并将其存储在缓存中。后续执行相同的预编译语句时,数据库可…...
联影医疗嵌入式面试题及参考答案(3万字长文)
假如你要做机器人控制,你会遵循怎样的开发流程? 首先,需求分析阶段。明确机器人的功能需求,例如是用于工业生产中的物料搬运、还是家庭服务中的清洁打扫等。了解工作环境的特点,包括空间大小、障碍物分布、温度湿度等因素。同时,确定机器人的性能指标,如运动速度、精度、…...
告别“人工智障”!OpenClaw + 大模型:打造真正能“看懂、想通、干成”的机械臂智能体
写在前面 在机器人圈子里,有个心照不宣的痛点:机械臂越来越便宜,但让它“听话”却越来越难。 传统的示教编程(Teaching Pendant)太慢,改个产品就得重教一遍;视觉定位(Vision Guided&…...
Biolaminin 层粘连蛋白(LN521)在干细胞培养中的作用与应用解析【曼博生物官方代理BioLamina】
摘要:人类重组层粘连蛋白(Laminin),尤其是LN521亚型,在多能干细胞培养中具有重要作用。本文从细胞微环境、培养体系及应用场景角度,对其在干细胞研究与转化中的价值进行系统梳理。 关键词:LN521…...
基于Hunyuan-MT-7B的算法竞赛题解翻译系统
基于Hunyuan-MT-7B的算法竞赛题解翻译系统 1. 引言 算法竞赛是全球程序员和算法爱好者展示实力的舞台,但语言障碍常常成为知识共享的壁垒。一道优秀的解题思路,可能因为语言不通而无法被更多人学习借鉴。传统的机器翻译工具在面对算法题解中的专业术语…...
第4章 编码规范-4.2 注释规范
注释规范包括文件注释、文档注释、代码注释和TODO注释。这里需要强调一点,即在程序代码中,对容易引起误解的代码进行注释是必要的,但应避免对已经清晰表达信息的代码进行再次注释,因为频繁的注释有时恰恰反映了代码的低质量&#…...
顺利毕业!一个能读懂学校要求的AI论文助手
作为一名即将毕业的大四学生,写毕业论文这件事,就像一座大山压在我心头。选题没方向,文献看不懂,最要命的是,学校发的那个十几页的写作要求,看得我头都大了,生怕自己辛辛苦苦写出来,…...
SecGPT-14B实战手册:Chainlit中集成Markdown渲染与代码块语法高亮
SecGPT-14B实战手册:Chainlit中集成Markdown渲染与代码块语法高亮 1. SecGPT-14B简介 SecGPT是由云起无垠推出的开源大语言模型,专门针对网络安全领域优化。该模型基于先进的自然语言处理技术,能够理解和生成与网络安全相关的专业内容。 S…...
LumiPixel优化升级:如何利用Z-Image模型生成更细腻的像素人像
LumiPixel优化升级:如何利用Z-Image模型生成更细腻的像素人像 1. 引言:像素艺术的复兴与挑战 像素艺术作为一种独特的数字艺术形式,近年来在游戏、NFT和数字设计领域迎来复兴。然而传统像素创作面临两大核心挑战: 细节表现力不…...
viem ABI工具使用教程:编码、解码和类型推断全攻略
viem ABI工具使用教程:编码、解码和类型推断全攻略 【免费下载链接】viem TypeScript Interface for Ethereum 项目地址: https://gitcode.com/gh_mirrors/vi/viem viem是一个轻量级、可组合且类型安全的TypeScript以太坊接口工具库,其强大的ABI工…...
RCLAMP0542T.TCT静电保护TVS 二极管阵列 SEMTECH 电子元器件IC 芯片
RCLAMP0542T.TCT 是由 SEMTECH 公司推出的一款超低电容、双通道ESD(静电放电)保护 TVS 二极管阵列,具备0.45pF 超低电容、5A 浪涌承受能力和超小型 SLP1610P4T 封装,专为高速数据接口设计,广泛应用于通信设备、消…...
RK3568 NPU RKNN(五):RKNN-ToolKit2性能与内存评估实战解析
1. 环境准备与工具链搭建 在开始RKNN-ToolKit2的性能与内存评估之前,我们需要先搭建完整的开发环境。这里以野火LubanCat开发板为例,具体硬件配置为RK3568芯片4GB内存版本。开发主机建议使用Ubuntu 20.04系统,确保Python版本在3.6-3.8之间。 …...
