【Rust】006-Rust 枚举与`match`、`if let`、`let else`

【Rust】006-Rust 枚举与matchif letlet else

文章目录

  • 【Rust】006-Rust 枚举与`match`、`if let`、`let else`
  • 一、简介
  • 二、使用场景
  • 三、基本使用
    • 1、定义枚举
    • 2、使用枚举
  • 四、功能详解
    • 1、带数据的枚举
    • 2、使用`match`进行模式匹配
    • 3、使用`if let`简化特定变体的处理
    • 4、使用`let else`处理带条件的匹配
  • 五、最佳实践及案例
    • 1、使用`match`确保完整性
    • 2、用`if let`简化代码
    • 3、使用`let else`处理不可预测的条件
  • 六、完整代码案例

一、简介

在编程中,我们经常需要处理一组有限的、明确的值。例如,在游戏中,角色的移动方向只有上、下、左、右四种选择。这种场景下,枚举(Enum)是一种非常合适的数据类型。Rust中的枚举不仅可以定义一组可能的值,还可以携带数据,使得代码更具表达力和安全性。


二、使用场景

枚举在Rust中有广泛的应用场景,特别是在以下情况下:

  • 状态管理:如定义有限状态机中的状态。
  • 数据分类:如处理不同类型的消息或事件。
  • 错误处理:如定义可能出现的错误类型。

三、基本使用

1、定义枚举

在Rust中,定义枚举非常简单。以下是一个基本的枚举定义示例:

// 定义一个枚举类型Direction,表示四个可能的方向
enum Direction {North,  // 北South,  // 南East,   // 东West,   // 西
}

在这个例子中,我们定义了一个Direction枚举,包含四个可能的方向。


2、使用枚举

使用枚举时,可以通过模式匹配来处理不同的枚举值:

// 根据传入的方向打印相应的移动指令
fn move_in_direction(direction: Direction) {match direction {Direction::North => println!("向北移动"),Direction::South => println!("向南移动"),Direction::East  => println!("向东移动"),Direction::West  => println!("向西移动"),}
}

在这个函数中,根据传入的方向参数,程序会打印出对应的移动方向。


四、功能详解

1、带数据的枚举

枚举的每个变体可以携带额外的数据,这使得枚举更加灵活:

// 定义一个枚举类型Message,表示不同类型的消息
enum Message {Quit,                           // 不携带数据的变体Move { x: i32, y: i32 },        // 携带结构体数据的变体Write(String),                  // 携带字符串数据的变体ChangeColor(i32, i32, i32),     // 携带三个i32类型数据的变体
}

在这个例子中,Message枚举的不同变体可以携带不同类型和数量的数据。


2、使用match进行模式匹配

match是处理枚举的强大工具,它可以确保处理所有可能的变体:

// 根据传入的消息类型执行相应的操作
fn process_message(msg: Message) {match msg {Message::Quit => println!("退出"),Message::Move { x, y } => println!("移动到位置: ({}, {})", x, y),Message::Write(text) => println!("写入消息: {}", text),Message::ChangeColor(r, g, b) => println!("更改颜色为: RGB({}, {}, {})", r, g, b),}
}

3、使用if let简化特定变体的处理

如果只关心某个变体,可以使用if let来简化代码:

let msg = Message::Write(String::from("Hello"));// 只处理Message::Write变体
if let Message::Write(text) = msg {println!("消息内容: {}", text);
}

4、使用let else处理带条件的匹配

let else可以用于处理那些可能不符合条件的情况,确保程序逻辑的完整性:

// 获取写入消息的文本内容,如果不是写入消息则返回默认文本
fn get_message_text(msg: Message) -> String {let Message::Write(text) = msg else {return String::from("不是一个写入消息");};text
}let msg = Message::Write(String::from("Hello"));
println!("{}", get_message_text(msg));

在这个例子中,如果msg不是Message::Write变体,函数会返回一个默认字符串。


五、最佳实践及案例

1、使用match确保完整性

在处理枚举时,尽量使用match进行模式匹配,以确保处理了所有可能的变体。这有助于避免遗漏情况,提升代码的安全性。


2、用if let简化代码

对于只关心某个变体的情况,可以使用if let简化代码,避免不必要的复杂性。


3、使用let else处理不可预测的条件

在处理可能不符合预期条件的情况时,let else可以帮助简化错误处理逻辑。


六、完整代码案例

// 定义一个枚举类型TrafficLight,表示交通灯的三种状态
enum TrafficLight {Red,    // 红灯Yellow, // 黄灯Green,  // 绿灯
}// 实现一个函数,用于根据交通灯的状态返回相应的等待时间
fn traffic_light_wait_time(light: TrafficLight) -> u32 {match light {TrafficLight::Red => 30,    // 红灯等待30秒TrafficLight::Yellow => 5,  // 黄灯等待5秒TrafficLight::Green => 0,   // 绿灯不需要等待}
}fn main() {// 创建一个红灯实例let red_light = TrafficLight::Red;// 获取红灯的等待时间let wait_time = traffic_light_wait_time(red_light);// 打印等待时间println!("红灯等待时间: {}秒", wait_time);// 创建一个绿灯实例let green_light = TrafficLight::Green;// 使用if let来处理特定的绿灯状态if let TrafficLight::Green = green_light {println!("绿灯,您可以通行!");} else {println!("请耐心等待!");}// 创建一个黄灯实例let yellow_light = TrafficLight::Yellow;// 使用let else来处理特定的黄灯状态let TrafficLight::Yellow = yellow_light else {println!("这不是黄灯状态");return;};println!("黄灯,请注意行驶!");
}

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

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

相关文章

0904作业+思维导图

一、作业 &#xff08;将昨天的作业修改为标准模板类的&#xff09; 1、代码 #include <iostream> #include <stack> using namespace std; //队列模板类 template<typename T> class Queue { private:int max; //队列最大容量int num; //队列内…

pikachu文件包含漏洞靶场通关攻略

本地文件包含 首先&#xff0c;在靶场根目录下创建一个php文件&#xff0c;内容是phpinfo(); 其次&#xff0c;上传一个任意球星图片&#xff0c;会跳转到带有filename参数的php文件下 然后&#xff0c;将filename的参数改为可以访问到我们创建的php文件的地址 ../../../../…

【计算机】1GB与1Gb与MB的关系

背景 看到个规格书列的芯片规格参数有错误&#xff0c;给对方指出来了下&#xff0c;并做了下科普。做下记录。 关系 1 Gb&#xff08;Gigabit&#xff09;和1 GB&#xff08;Gigabyte&#xff09;之间的区别主要在于“b”和“B”的含义。通常&#xff1a; 1 Gb (Gigabit) 中…

TCP协议多进程多线程并发服务器

TCP多进程多线程并发服务器 1.多进程并发服务器 #include <myhead.h>#define SERPORT 6666 #define SERIP "192.168.0.136" #define BLACKLOG 10void hande(int a) {if(aSIGCHLD){while(waitpid(-1,NULL,WNOHANG)!-1);//回收僵尸进程} }int main(int argc, c…

【Grafana】Prometheus结合Grafana打造智能监控可视化平台

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Oracle 客户端 PL/SQL Developer 15.0.4 安装与使用

目录 官网下载与安装 切换中文与注册 连接Oracle数据库 tnsnames.ora 文件使用 Oracle 客户端 PL/SQL Developer 12.0.7 安装、数据导出、Oracle 执行/解释计划、for update。 官网下载与安装 1、官网&#xff1a;https://www.allroundautomations.com/products/pl-sql-d…

Redis的配置和启动+Redis Insight连接

一、安装 Redis的安装&#xff1a;从镜像站下载&#xff1a;索引 redis-local (huaweicloud.com)&#xff0c;然后将其传到Linux虚拟机中进行解压&#xff0c;解压之后需要下载gcc&#xff0c;因为Redis底层是用c写的&#xff0c;所以要编译一下生成redis文件&#xff0c;然后…

vite项目配置本地开发使用https访问

在Vite项目中启用HTTPS以安全地使用navigator.mediaDevices.getUserMedia() 引言 在现代Web开发中&#xff0c;保护用户隐私和数据安全是至关重要的。特别是在涉及到媒体捕获功能&#xff0c;如使用用户的摄像头或麦克风时&#xff0c;Web应用需要遵循严格的安全准则。naviga…

反向迭代器:reverse_iterator的实现

目录 前言 特点 注意事项 实现 构造函数 功能函数 在list与vector中的使用 vector list 前言 反向迭代器是一种在序列容器的末尾开始&#xff0c;并向前移动至序列开始处的迭代器。在C中&#xff0c;反向迭代器由标准库中的容器类提供&#xff0c;比如vector、list、d…

Ansible剧本编写指南:从简单任务到复杂自动化的实现

Ansible剧本编写指南&#xff1a;从简单任务到复杂自动化的实现 Ansible 是一个流行的开源自动化工具&#xff0c;被广泛用于配置管理、应用部署、任务自动化以及 IT 基础设施的编排。它的核心是简单且易于学习的 YAML 格式&#xff0c;使用户能够编写可重用、可维护的剧本&am…

Qt 字符串的编码方式,以及反斜杠加3个数字是什么编码\344\275\240,如何生成

Qt 字符串的编码方式 问题 总所周知&#xff0c;Qt的ui文件在编译时&#xff0c;会自动生成一个ui_xxxxx.h的头文件&#xff0c;打开一看&#xff0c;其实就是将摆放的控件new出来以及布局的代码。 只要用Qt提供的uic.exe工具&#xff0c;自己也可以将ui文件输出为代码文件…

rust feature 简介

Rust 的 feature 是一种机制&#xff0c;用于在编译时选择性地启用或禁用代码的某些部分。通过 feature&#xff0c;你可以在 Cargo.toml 中定义哪些功能需要启用&#xff0c;并在代码中通过条件编译来控制代码的编译与否。下面是 feature 机制的详解&#xff1a; 1. 基本概念…

设计模式 18 备忘录模式

设计模式 18 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…

c# 笔记 winform添加右键菜单,获取文件大小 ,多条件排序OrderBy、ThenBy,list<double>截取前5个

Winform右键菜单‌ 要在C# Winform应用程序中添加右键菜单&#xff0c;‌你可以按照以下步骤操作&#xff1a;‌ 1.‌创建菜单项‌ 在Form的构造函数或加载事件中&#xff0c;‌创建ContextMenuStrip控件的实例&#xff0c;‌并为其添加菜单项。‌ 2.‌绑定到控件‌ 将Con…

tcp 流量控制

TCP流量控制是TCP/IP协议中用于控制发送方和接收方之间数据传输速率的一种机制&#xff0c;以防止网络拥塞和确保网络资源的有效利用。流量控制主要通过调整TCP窗口大小来实现&#xff0c;确保发送方不会发送超出接收方处理能力的数据量。以下是TCP流量控制的关键概念和工作原理…

c++ websocket简单讲解

只做简单讲解。 一.定义和原理 WebSocket 是从 HTML5 开始⽀持的⼀种⽹⻚端和服务端保持⻓连接的消息推送机制&#xff0c;传统的 web 程序都是属于 "⼀问⼀答" 的形式&#xff0c;即客⼾端给服务器发送了⼀个 HTTP 请求&#xff0c;服务器给客⼾端返回⼀个 HTTP 响…

Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue

BlockingQueue BlockingQueue 是Java并发包&#xff08;java.util.concurrent&#xff09;中提供的一个阻塞队列接口&#xff0c;它继承自 Queue 接口。 BlockingQueue 中的元素采用 FIFO 的原则&#xff0c;支持多线程环境并发访问&#xff0c;提供了阻塞读取和写入的操作&a…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步&#xff0c;视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能&#xff0c;特别是偏色检测和噪声检测&#xff0c;进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

【AI】Pytorch_损失函数优化器

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 本文已达到10w字&#xff0c;故按模块拆开&#xff0c;详见目录导航。 整体框架如下 数据及预处理 模型及其构建 损失函数及优化器 本节目录 损失函数创建损失函数 &#xff08;共18个&#xff09;nn.CrossEnt…

【openwrt-21.02】T750 openwrt MT7916 WPS PBC功能实现

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …