学习Rust的第10天:枚举和模式匹配

今天我们来看看一个类似的概念 enums 。

  • Enums: We saw that in Rust, enums are data types that list possible values, giving a simple and type-safe mechanism to describe alternatives. We looked at how to create enums and use them to represent similar possibilities, such as days of the week.
    枚举:我们看到在Rust中,枚举是列出可能值的数据类型,提供了一种简单且类型安全的机制来描述替代方案。我们研究了如何创建枚举并使用它们来表示类似的可能性,例如一周中的几天。
  • Methods in Enums: Similar to structs, we saw that we can implement methods on enums using an impl block. We demonstrated this by creating methods to calculate the area of different geometric shapes represented by an enum.
    枚举中的方法:与结构类似,我们看到可以使用 impl 块在枚举上实现方法。我们通过创建方法来计算枚举表示的不同几何形状的面积来证明这一点。
  • Option Enum: We discussed the Option enum, which is commonly used to handle scenarios where a value may be present or absent. We explored how Some represents a value being present, while None indicates the absence of a value. Additionally, we learned how to use the unwrap_or method to handle situations where we need to extract a value from an Option or provide a default value if it's absent.
    Option Enum:我们讨论了 Option enum,它通常用于处理值可能存在或不存在的情况。我们探讨了 Some 如何表示存在的值,而 None 表示不存在的值。此外,我们还学习了如何使用 unwrap_or 方法来处理需要从 Option 中提取值或提供默认值(如果没有)的情况。
  • Pattern Matching: Finally, we explored pattern matching using the match keyword, which allows us to check for multiple cases and execute specific code based on the matched pattern. We demonstrated how to use match to handle various cases and execute corresponding code blocks.
    模式匹配:最后,我们使用 match 关键字探索了模式匹配,它允许我们检查多个案例并基于匹配的模式执行特定代码。我们演示了如何使用 match 来处理各种情况并执行相应的代码块。

Introduction 介绍

Enums in Rust are data types that allow you to define a type by enumerating its possible values, providing a concise and type-safe way to represent alternatives.
Rust中的枚举是一种数据类型,允许您通过枚举其可能的值来定义类型,提供一种简洁且类型安全的方式来表示替代方案。

enum Day{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday,
}fn main(){let today = Day::Monday;
}

This is what enums basically are…
这就是 enums 基本上是...

If we had to store each day with the programming language we were going to study in Rust. We would do something like this with structs
如果我们不得不用Rust中将要学习的编程语言来存储每一天。我们会用 structs 做这样的事情

enum Day{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday,
}Struct TimeTable{day: Day,language: String,
}fn main(){let day1 = TimeTable{day: Day::Monday,language: String::from("Rust"),};
}

An alternative way would be to store values inside enums .
另一种方法是将值存储在 enums 中。

enum Day{Monday(String),Tuesday(String),Wednesday(String),Thursday(String),Friday(String),Saturday(String),Sunday(String),
}Struct TimeTable{day: Day,language: String,
}fn main(){let day1 = Day::Monday(String::from("Rust"));
}

Methods in Enums 枚举中的方法

Just like we did for structs, we can create an impl block to implement methods in enums .
就像我们对 structs 所做的那样,我们可以创建一个 impl 块来实现 enums 中的方法。

// Define an enum called Shape to represent different geometric shapes
enum Shape {Circle(f64), // Variant Circle takes a radiusSquare(f64), // Variant Square takes a side length
}// Implement methods on the Shape enum
impl Shape {// Method to calculate the area of a shapefn area(&self) -> f64 {match *self {Shape::Circle(radius) => 3.14 * radius * radius,Shape::Square(side_length) => side_length * side_length,}}
}fn main() {// Create instances of different shapeslet circle = Shape::Circle(2.0);let square = Shape::Square(3.0);// Calculate and print the areas of different shapesprintln!("Area of the circle: {:.2}", circle.area());println!("Area of the square: {:.2}", square.area());
}

Output: 输出量:

Area of the circle: 12.57
Area of the square: 9.00

Explanation 解释

  • We define an enum named Shape that represents geometric shapes.
    我们定义了一个名为Shape的枚举来表示几何形状。
  • Shape has two variations: Circle(f64), which represents a circle with a radius, and Square(f64), which represents a square with a side length.
    形状有两种变体:圆形(f64),表示具有半径的圆形;方形(f64),表示具有边长的方形。
  • The Shape enum is implemented with a method called area().
    Shape 枚举是用一个名为 area() 的方法实现的。
  • The area() method takes a reference to self (the enum instance) and returns a f64 representing the area of the shape.
    area() 方法引用 self (枚举实例)并返回表示形状区域的 f64 。
  • The match keyword in Rust allows for pattern matching against different values and executing code based on the matched pattern, providing a concise and powerful way to handle various cases or variants within enums, structs, or other types.
    Rust中的 match 关键字允许对不同的值进行模式匹配,并基于匹配的模式执行代码,提供了一种简洁而强大的方式来处理枚举,结构或其他类型中的各种情况或变体。
  • For Shape::Circle, it calculates the area using the formula π * radius^2.
    对于 Shape::Circle ,它使用公式π * 半径^2计算面积。
  • For Shape::Square, it calculates the area using the formula side_length^2.
    对于 Shape::Square ,它使用公式side_length^2计算面积。
  • In the main() function: 在 main() 函数中:
  • Instances of different shapes (circle and square) are created.
    将创建不同形状的图形( circle 和 square )。
  • The area() method is called on each shape instance to calculate and print their respective areas.
    在每个形状实例上调用 area() 方法来计算和打印它们各自的面积。
  • Finally, the areas of the circle and square are printed with two decimal places using println!() statements.
    最后,使用 println!() 语句将圆形和正方形的面积打印为两位小数。

Option Enum Option枚举

The Option enum in Rust represents the presence or absence of a value, providing a concise and type-safe way to handle scenarios where a value may be present or missing.
Rust中的 Option enum 表示值的存在或不存在,提供了一种简洁和类型安全的方式来处理值可能存在或缺失的场景。

If we have a value that’s null, or can potentially not exist we use a null value but Rust does not have a null type, We can use Option enums for these situations.
如果我们有一个null值,或者可能不存在,我们使用 null 值,但Rust没有null类型,我们可以使用Option枚举来处理这些情况。

This enforces the type system that we have to handle the null case leading to a safer code.
这强制了类型系统,我们必须处理null情况,从而导致更安全的代码。

  • Some is used when a value is present
    Some 在存在值时使用
  • none is used when when a value is absent
    none 在缺少值时使用
  • From here we can use match operations to enumerate cases for both.
    从这里我们可以使用 match 操作来枚举两者的情况。
fn get_first_element(numbers: &[i32]) -> Option<i32> {if let Some(&first) = numbers.first() {Some(first) // Return the first element wrapped in Some if it exists} else {None // Return None if the slice is empty}
}

Explanation 解释

  • The get_first_element function takes a slice of integers numbers as its parameter.
    get_first_element 函数接受一个整数切片 numbers 作为其参数。
  • It uses the .first() method on the slice to retrieve an Option containing a reference to the first element of the slice.
    它使用切片上的 .first() 方法来检索包含对切片第一个元素的引用的Option。
  • If the slice is not empty, .first() returns Some(&first), where first is a reference to the first element.
    如果切片不为空,则 .first() 返回 Some(&first) ,其中 first 是对第一个元素的引用。

The function pattern matches on the Option:
函数模式在Option上匹配:

  • If the Option is Some, it extracts the value of first and wraps it in another Some, effectively unwrapping the reference.
    如果Option是 Some ,它提取 first 的值并将其包装在另一个 Some 中,有效地展开引用。
  • If the Option is None, indicating an empty slice, it returns None.
    如果Option是 None ,表示一个空切片,则返回 None 。

Using Option enums with primitive data types
将Option枚举与基元数据类型一起使用

fn main(){let x: i8 = 10;let y: Option<i8> = Some(14);let sum = x + y;
}

This code will result in an error, because we cannot add i8 to Option<i8> because they are different data types.
这段代码将导致错误,因为我们不能将 i8 添加到 Option<i8> ,因为它们是不同的数据类型。

To complete this operation we can use the unwrap_or() method.
要完成此操作,我们可以使用 unwrap_or() 方法。

unwrap_or(data) returns the value of the Option enum if it exits, if it does not exist it returns data.
unwrap_or(data) 如果存在,则返回 Option enum 的值,如果不存在,则返回 data 。

fn main(){let x: i8 = 10;let y: Option<i8> = Some(14);let sum = x + y.unwrap_or(0);println!("{}",sum);
}

Output: 输出量:

24

Pattern matching 模式匹配

We have used match in the guessing game, It is used to check for multiple cases and run a specific block of code for each value.
我们在猜谜游戏中使用了 match ,它用于检查多个情况并为每个值运行特定的代码块。

Here is a simple example:
下面是一个简单的例子:

fn main() {let number = 5;match number {1 => println!("It's one!"),2 => println!("It's two!"),3 | 4 => println!("It's three or four!"),8 => {println!("This is a multi-line function in a match expression");},_ => println!("It's something else!"),}
}
  • The match keyword is used to perform pattern matching on the value of number.
    match 关键字用于对 number 的值执行模式匹配。
  • Each pattern in the match expression is followed by =>, indicating the code to execute if the pattern matches.
    match 表达式中的每个模式后面都跟有 => ,表示如果模式匹配则执行的代码。
  • If number matches the pattern 1, the message "It's one!" is printed.
    如果 number 匹配模式 1 ,则消息“It's one!”是印刷的。
  • If number matches the pattern 2, the message "It's two!" is printed.
    如果 number 匹配模式 2 ,则消息“It's two!”是印刷的。
  • If number matches the patterns 3 or 4, the message "It's three or four!" is printed.
    如果 number 匹配模式 3 或 4 ,则消息“是三或四!”是印刷的。
  • If number matches the pattern 8, the code inside the curly braces is executed, printing "This is a multi-line function in a match expression".
    如果 number 匹配模式 8 ,则执行花括号内的代码,打印“This is a multi-line function in a match expression”。
  • The _ pattern acts as a wildcard and matches any value not explicitly listed. If number doesn't match any of the specified patterns, the message "It's something else!" is printed.
    _ 模式作为一个前缀,匹配任何没有显式列出的值。如果 number 不匹配任何指定的模式,则消息“It's something else!”是印刷的。
  • In this specific example, since number is 5, it doesn't match any of the specific patterns, so the wildcard pattern _ is used, and the message "It's something else!" is printed.
    在这个特定的例子中,由于 number 是 5 ,它不匹配任何特定的模式,所以使用了重复模式 _ ,并且消息“It's something else!”是印刷的。

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

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

相关文章

webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用

本文讲的全部知识点&#xff0c;都是和webpack相关的。如果你之前有疑问&#xff0c;那本文一定能帮你搞清楚。 问题来源一般是类似下面代码&#xff08;webpack.json中&#xff09;&#xff1a; "scripts": {"dev": "cross-env NODE_ENVdevelopmen…

opencv android 使用笔记

目录 获取app路径&#xff1a; 下载&#xff1a;OpenCV-android-sdk cmakelist配置&#xff1a; 头文件路径&#xff1a; 编译报错&#xff1a;clang: error: linker command failed with exit code 1 (use -v to see invocation) 读取图片例子 保存mp4 获取app路径&am…

自定义一个RedisTemplate

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis&…

springcloud Ribbon的详解

1、Ribbon是什么 Ribbon是Netflix发布的开源项目&#xff0c;Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的框架。 2、Ribbon能干什么 LB负载均衡(Load Balance)是什么&#xff1f;简单的说就是将用户的请求平摊的分配到多个服务上&#xff0c;从而达…

<前端>Electron-builder为公证后的app打更新信息latest.yml

MacOS下&#xff0c;Electron-builder可以很方便的为测试包app打更新信息&#xff08;latest-mac.yml&#xff09;。 但是&#xff0c;正式发布的时候&#xff0c;不可能用测试包app&#xff0c;因为还没有进行公证。如何为公证的app打latest-mac.yml呢。 其实观察latest-mac.y…

Keil和VSCode协同开发STM32程序

系列文章 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 配置环境 2. 测试打开工程 3. 测试编译工程 随着项目的复杂度上升&#xff0c;开发者不仅需要强大的硬件支持&#xff0c;还需要一个高效和灵活的开发环境。 vscode是一款集成大量可以便携开发插件的代码…

C++中的list类模拟实现

目录 list类模拟实现 list类节点结构设计 list类非const迭代器结构设计 迭代器基本结构设计 迭代器构造函数 operator()函数 operator*()函数 operator!()函数 operator(int)函数 operator--()函数 operator--(int)函数 operator()函数 operator->()函数 list…

TiDB 6.x 新特性解读 | Collation 规则

对数据库而言&#xff0c;合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则&#xff0c;并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。 引 这里的“引”&#xff0c;…

Modbus转Profinet网关接称重设备与工控机通讯

Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口&#xff0c;使得不同设备之间可以顺利进行通信&#xff0c;进一步提升了工业自动化程度。 通过使用Modbus转Pr…

相亲平台app小程序

相亲平台app小程序是一种基于手机应用的微型程序&#xff0c;专为在线相亲交友活动设计。它提供了一系列的功能&#xff0c;旨在帮助用户更方便、更高效地找到心仪的伴侣。 首先&#xff0c;用户可以在个人资料部分上传照片、填写个人资料、设置兴趣爱好等信息&#xff0c;以便…

Electron+Vue3+ElectronForge整合 - 打包时整合 -分步打包

说明 本文介绍一下 Electron Vue3 的打包整合的基本操作。实现的效果是 &#xff1a; 1、一个正常的Vue3项目&#xff1b; 2、整合加入 Electron 框架 &#xff1a;开发时 Electron 加载的是开发的vue项目&#xff1b; 3、完成打包时整合&#xff1a;3.1 先完成vue3项目的正常…

Laravel 6 - 第十一章 中间件

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

深度解析:云计算的三宝——IaaS、PaaS和SaaS

4月22日&#xff0c;腾讯宣布旗下协作SaaS产品全面接入腾讯混元大模型&#xff0c;除去企业微信、腾讯会议、腾讯文档等“一门三杰”产品&#xff0c;腾讯乐享、腾讯电子签、腾讯问卷、腾讯云AI代码助手等协作SaaS产品也都已实现智能化升级。大模型应用落地再加速。 那么什么是…

2024年深圳杯东三省数学建模联赛A题论文首发第二种思路

深圳杯A题论文代码分享资料链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1L2NVgoefSW-yuqZjEB3wcw 提取码&#xff1a;sxjm 问题一 数据转换&#xff1a; 首先&#xff0c;我们将监测站的经纬度坐标转换为基于米的笛卡尔坐标系。这是因为在地面上的大尺度距离…

HarmonyOS开发案例:【音乐播放器】

介绍 使用ArkTS语言实现了一个简易的音乐播放器应用&#xff0c;主要包含以下功能&#xff1a; 播放应用中的音频资源文件&#xff0c;并可进行上一曲、下一曲、播放、暂停、切换播放模式&#xff08;顺序播放、单曲循环、随机播放&#xff09;等操作。结合后台任务管理模块&…

安全小课堂丨什么是暴力破解?如何防止暴力破解

什么是暴力破解&#xff1f; 暴力破解也可称为穷举法、枚举法&#xff0c;是一种比较流行的密码破译方法&#xff0c;也就是将密码进行一一推算直到找出正确的密码为止。比如一个6位并且全部由数字组成的密码&#xff0c;可能有100万种组合&#xff0c;也就是说最多需要尝试10…

JWT原理解析

一、概述 虽然现在很多的开发框架会支持JWT的使用&#xff0c;但是对JWT还是没有一个详细的了解&#xff0c;有很多疑惑&#xff1a; JWT比之前的session或者token有什么好处&#xff1f;JWT的构成元素是什么&#xff1f;JWT从生成到使用的详细流程&#xff1f; 二、 JWT 2…

SPI Flash and External SPI RAM(基于ESP32)

主要参考资料&#xff1a; 乐鑫ESP-IDF资料SPI Flash API: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/peripherals/spi_flash/index.html 乐鑫ESP-IDF资料SPI Flash and External SPI RAM Configuration: https://docs.espressif.com/pro…

场景 - 分库分表

分什么 数据量大分表&#xff0c;并发大分库 分表字段如何选择 如果对交易订单进行分表&#xff0c;可以选择的东西很多&#xff0c;比如说商户id&#xff0c;用户id&#xff0c;地区等等 分表的时候要考虑到数据倾斜问题 数据倾斜 比如说按商户号进行分表&#xff0c;一共…

pnpm 安装后 node_modules 是什么结构?为什么 webpack 不识别 pnpm 安装的包?

本篇研究&#xff1a;使用 pnpm 安装依赖时&#xff0c;node_modules 下是什么结构 回顾 npm3 之前&#xff1a;依赖树 缺点&#xff1a; frequently packages were creating too deep dependency trees, which caused long directory paths issue on Windowspackages were c…