Rust学习笔记_10——守卫

Rust学习笔记_07——枚举和范围
Rust学习笔记_08——String
Rust学习笔记_09——模式匹配

守卫

文章目录

    • 守卫
      • 1. 介绍
      • 2. 基本用法
      • 3. 示例
      • 4. 复杂用法
      • 5. if let
        • 5.1 基本用法
        • 5.2 示例
        • 5.3 守卫与if let的区别与联系


1. 介绍

在Rust中,守卫(guard)是match表达式中的一个特性,它允许你在模式匹配的过程中附加一个条件。这个条件是一个表达式,它必须返回一个布尔值(bool),用于进一步细化或约束某个模式何时应该被匹配。守卫通过if关键字引入,并紧跟在模式之后。

2. 基本用法

match value {
    pattern if condition => result,
    _ => default_result,
}


// value 是你想要匹配的值。
// pattern 是你要匹配的模式。
// condition 是一个返回布尔值的表达式,用于进一步约束pattern。
// result 是当value匹配pattern且condition为true时要执行的代码块或返回的值。
// _ 是通配符模式,匹配所有其他情况。
// default_result 是当value不匹配任何带有守卫的模式时执行的代码块或返回的值。

3. 示例

let number = 10;

match number {
    n if n > 5 => println!("Number is greater than five"),
    n if n <= 5 => println!("Number is five or less"),
    _ => println!("This should never be printed"),  // 这个分支实际上是不会被执行的,因为上面的两个分支已经覆盖了所有可能的情况。
}

number被匹配了两次,但每次匹配都附带了一个守卫。第一个守卫检查number是否大于5,如果是,则执行第一个代码块。第二个守卫检查number是否小于或等于5,如果是,则执行第二个代码块。由于这两个守卫已经覆盖了所有可能的整数情况,因此通配符模式_对应的代码块实际上是不会被执行的

4. 复杂用法

fn is_even(n: i32) -> bool {
    n % 2 == 0
}

let number = 4;

match number {
    n if is_even(n) && n > 2 => println!("Number is even and greater than two"),
    n if is_even(n) => println!("Number is even"),
    _ => println!("Number is odd"),
}

is_even函数用于检查一个数字是否是偶数。match表达式使用守卫来进一步细化匹配条件,分别处理偶数且大于2、偶数和奇数的情况。

5. if let

if let是Rust中的一个语法糖,它允许你在只关心一个特定模式的情况下,避免编写完整的match表达式。if let的语法更加简洁,易于阅读。

5.1 基本用法
if let pattern = value {
    // 当value匹配pattern时要执行的代码块
} else {
    // 可选的else分支,当value不匹配pattern时要执行的代码块
}


// pattern:你要匹配的模式。
// value:你想要匹配的值。
// 代码块:当value匹配pattern时要执行的代码。
// else分支:可选的,当value不匹配pattern时要执行的代码。

5.2 示例

let some_option: Option = Some(42); if let Some(value) = some_option { println!(“Got a value: {}”, value); } else { println!(“No value found”); }

5.3 守卫与if let的区别与联系
  • 区别
    • 守卫是match表达式中的一个特性,用于在模式匹配的过程中附加额外的条件。
    • if let是一个独立的语法结构,用于在只关心一个特定模式的情况下简化代码。
    • 守卫必须返回一个布尔值,而if let则通过模式匹配来检查值。
  • 联系
    • 守卫和if let都允许你在一定条件下执行特定的代码块。
    • 在某些情况下,你可以使用match表达式和守卫来实现与if let相同的功能,但if let通常更加简洁和直观。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用epoll监测定时器是否到达指定时间,并执行回调函数

总览&#xff1a;Linux提供了定时器&#xff0c;暴露出来了文件描述符&#xff0c;所以我们使用epoll帮助我们监测&#xff0c;时间到达后&#xff0c;epoll_wait返回&#xff0c;于是我们根据fd&#xff0c;找到对应的回调函数&#xff0c;然后执行。从而达到定时执行函数的目…

鸿蒙征文|鸿蒙技术分享:使用到的开发框架和技术概览

目录 每日一句正能量前言正文1. 开发环境搭建关键技术&#xff1a;2. 用户界面开发关键技术&#xff1a;3. 应用逻辑开发关键技术&#xff1a;4. 应用测试关键技术&#xff1a;5. 应用签名和打包关键技术&#xff1a;6. 上架流程关键技术&#xff1a;7. 后续维护和更新关键技术…

【MIT-OS6.S081笔记0.5】xv6 gdb调试环境搭建

补充一下xv6 gdb调试环境的搭建&#xff0c;我这里装的是最新的15.2的gdb的版本。我下载的是下面的第二个xz后缀的文件&#xff1a; 配置最详细的步骤可以参考下面的文章&#xff1a; [MIT 6.S081] Lab 0: 实验配置, 调试及测试 这里记录一下踩过的一些报错&#xff1a; 文…

Python和Java后端开发技术对比

在当今互联网技术飞速发展的时代&#xff0c;后端开发扮演着至关重要的角色。Python和Java作为两大主流的后端开发语言&#xff0c;各自具备独特的优势和应用场景。让我们深入了解这两种技术的特点和选择建议。 Java后端开发一直是企业级应用的首选方案。它以强大的类型系统、…

1.2.3 逻辑代数与运算

逻辑代数与运算 基本的逻辑运算常用逻辑公式 基本的逻辑运算 基本逻辑运算非常简单&#xff0c;只包含与、或、非、异或这4种。 这里主要留意对基本逻辑运算的不同叫法&#xff0c;符号表示。逻辑表达式、真值表概念。 与&#xff1a;A和B都为真时&#xff0c;结果才为真或…

解析生成对抗网络(GAN):原理与应用

目录 一、引言 二、生成对抗网络原理 &#xff08;一&#xff09;基本架构 &#xff08;二&#xff09;训练过程 三、生成对抗网络的应用 &#xff08;一&#xff09;图像生成 无条件图像生成&#xff1a; &#xff08;二&#xff09;数据增强 &#xff08;三&#xff…

零售餐饮收银台源码

收银系统早已成为门店经营的必备软件工具&#xff0c;因为各个连锁品牌有自己的经营模式&#xff0c;自然对收银系统需求各有不同&#xff0c;需要有相应的功能模块来实现其商业模式。 1. 适用行业 收银系统源码适用于零售、餐饮等行业门店&#xff0c;如商超便利店、水果生鲜…

我的第一个创作纪念日 —— 梦开始的地方

前言 时光荏苒&#xff0c;转眼间&#xff0c;我已经在CSDN这片技术沃土上耕耘了365天 今天&#xff0c;我迎来了自己在CSDN的第1个创作纪念日&#xff0c;这个特殊的日子不仅是对我过去努力的肯定&#xff0c;更是对未来持续创作的激励 机缘 回想起初次接触CSDN&#xff0c;那…

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh&#xff0c;那么配置文件是.zshrc&#xff08;打开zsh配置&#xff0c;这里举&#x1f330;使用zsh&#xff09; sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本&#xff08;这里的code就是快捷命令可以进…

计算帧率、每秒过多少次

1、c #include <iostream> #include <opencv2/opencv.hpp> #include <string> #include <thread> #include <atomic>using namespace std;const int NUM_THREADS 1; // 线程数量std::atomic<int> frameCounts[NUM_THREADS]; // 每个线程…

【在Linux世界中追寻伟大的One Piece】读者写者问题与读写锁

目录 1 -> 读者写者问题 1.1 -> 什么是读者写者问题 1.2 -> 读者写者与生产消费者的区别 1.3 -> 如何理解读者写者问题 2 -> 读写锁 2.1 -> 读写锁接口 3 -> 读者优先(Reader-Preference) 4 -> 写者优先(Writer-Preference) 1 -> 读者写者…

PS的功能学习(修复、画笔)

混合器画笔工具 就像&#xff0c;电子毛笔 关键功能有两个&#xff0c;自带一个混合器色板 清理画笔是全清&#xff0c;换一支新的毛笔&#xff0c;执行完之后在判断是否载入画笔 载入画笔就是把前景色上的颜色进行叠加处理&#xff0c;重新混入当前的混合色 &#xff08;…

centos 7 离线安装postgis插件

前一段时间记录了下如何在centos7中离线安装postgresql&#xff0c;因为工作需要&#xff0c;我不仅要安装postgresql&#xff0c;还需要安装postgis插件&#xff0c;这篇文章记录下postgis插件的安装过程。 1. 安装前的参考 如下的链接都是官网上的链接&#xff0c;对你安装p…

Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)

目录 前言 在开发过程中&#xff0c;我们经常遇到一些看似简单的问题&#xff0c;但有时正是这些细节问题让我们头疼不已。今天&#xff0c;我就来和大家分享一个我在开发过程中遇到的 el-switch 使用的小坑&#xff0c;希望大家在使用时能够避免。 一. 问题背景 二. 问题分…

同时使用Tmini和GS2两个雷达

24.12.02 要求&#xff1a;同时使用两个雷达。 问题在于:两个雷达都是ydlidar&#xff0c;使用同一个包。 因此同时启动GS2.launch和Tmini.launch会调用同一个功能节点&#xff0c;使用同一个cpp文件。 方法&#xff1a;新建一个cpp节点。 但同时保持在同一个坐标系&#xff0…

高等数学函数的性质

牛顿二项公式 ( x y ) n ∑ k 0 n C n k ⋅ x n − k y k (xy)^n\stackrel{n}{\sum\limits_{k0}}C^k_n\sdot x^{n-k}y^k (xy)nk0∑​n​Cnk​⋅xn−kyk. 映射 f : X → Y f:X\rightarrow Y f:X→Y&#xff0c; f f f 为 X X X 到 Y Y Y 的映射。 f f f 是一个对应关系&am…

【MySQL】深度学习数据库开发技术:mysql事务穿透式解析

前言&#xff1a;本节内容开始讲解事务。 博主计划用三节来讲解事务。 本篇为第一节&#xff0c; 主要解释什么是事务&#xff0c; 事务有什么用。 以及事物的基本操作和异常退出回滚情况。 下面不多说&#xff0c;友友们&#xff0c; 开始学习吧&#xff01; ps&#xff1a;本…

Swift解题 | 求平面上同一条直线的最多点数

文章目录 前言摘要问题描述解题思路Swift 实现代码代码分析示例测试与结果时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 149. 直线上最多的点数 不积跬步&#xff0c;无以至千里&#xff1b;不积…

使用Ansible自动化部署Zabbix6监控

1、获取Ansible离线部署包 链接&#xff1a;https://pan.baidu.com/s/1EjI02Ni8m9J4eJeBcJ-ZUQ?pwdzabx 提取码&#xff1a;zabx 2、安装Ansible wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum -y install ansible3、修改hosts文件…

lua闭包Upvalue

闭包 lua任何函数都是闭包&#xff0c;闭包至少带1个upValue&#xff1b; CClosure是使用Lua提供的lua_pushcclosure这个C-Api加入到虚拟栈中的C函数&#xff0c;它是对LClosure的一种C模拟 如string.gmatch就是cclosure 定义&#xff1a; #define ClosureHeader \CommonH…