Rust的enum枚举的强大用法

在这里插入图片描述

在Rust中,enum(枚举)是一种非常强大的类型,它可以包含多个变体(variants),每个变体可以是不同的类型,包括复杂类型。这使得enum在Rust中不仅用于表示简单的状态或选项集合,还可以用于表示更复杂的数据结构。

以下是一个具体的例子,展示了Rust中enum如何包含复杂类型:

// 定义一个结构体,表示一个点(Point)
#[derive(Debug)]
struct Point {x: i32,y: i32,
}// 定义一个枚举,表示不同的形状(Shape)
#[derive(Debug)]
enum Shape {Circle {radius: i32,center: Point, // 复杂类型:包含一个Point结构体},Rectangle {width: i32,height: i32,top_left: Point, // 复杂类型:包含一个Point结构体},// 可以添加更多变体,例如三角形等,每个都可以有自己的字段
}fn main() {// 创建Circle形状的实例let circle = Shape::Circle {radius: 10,center: Point { x: 0, y: 0 },};// 创建Rectangle形状的实例let rectangle = Shape::Rectangle {width: 20,height: 10,top_left: Point { x: -10, y: -5 }, // 矩形左上角的位置};// 打印形状信息println!("{:?}", circle);println!("{:?}", rectangle);// 匹配形状并执行不同操作match circle {Shape::Circle { radius, center } => {println!("Circle with radius {} and center at ({}, {})", radius, center.x, center.y);},Shape::Rectangle { width, height, top_left } => {// 这里不会匹配到,因为circle是Circle变体// 但为了完整性,我们仍然提供这个分支println!("Rectangle with width {}, height {}, and top-left at ({}, {})", width, height, top_left.x, top_left.y);},// 可以添加更多变体匹配分支(尽管在这个例子中不需要)}match rectangle {Shape::Circle { .. } => {// 这里不会匹配到,因为rectangle是Rectangle变体},Shape::Rectangle { width, height, top_left } => {println!("Matched Rectangle: width = {}, height = {}, top-left = ({}, {})", width, height, top_left.x, top_left.y);},}
}

在这个例子中,Shape枚举有两个变体:CircleRectangle。每个变体都有自己的字段,这些字段可以是基本类型(如i32)或复杂类型(如Point结构体)。在main函数中,我们创建了Shape枚举的两个实例:一个Circle和一个Rectangle,并打印了它们的信息。然后,我们使用match表达式来匹配这些形状并执行不同的操作。

另外还可以对该枚举类型进行方法实现扩展:

enum Shape {Circle {radius: i32,center: Point, // 复杂类型:包含一个Point结构体},Rectangle {width: i32,height: i32,top_left: Point, // 复杂类型:包含一个Point结构体},// 可以添加更多变体,例如三角形等,每个都可以有自己的字段
}impl Shape {pub fn area(&self) -> f64 {match self {Shape::Rectangle { width, height } => (width as f64) * (height as f64),  Shape::Circle { radius } => std::f64::consts::PI * (radius as f64).powi(2), }
}

这个例子展示了Rust中enum如何能够包含复杂类型,并展示了如何使用这些复杂类型来进行模式匹配和数据处理。

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

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

相关文章

jmeter基础01-2_环境准备-Mac系统安装jdk

Step1. 查看系统类型 方法:苹果菜单 - 关于本机,看到本机为M1芯片。(Mac系统芯片有M系列和Intel两种) Step2. 官网下载安装包 https://www.oracle.com/java/technologies/downloads/ 根据芯片类型,选择安装包进行下…

引起what(): basic_string::_M_replace_aux问题的一个原因以及解决方法

自己在做一个项目的时候,报了下面的这个问题: terminate called after throwing an instance of std::length_error what(): basic_string::_M_replace_aux 经过自己的研究,发现是在读取文件的时候没有加上错误判断。 通过网站直接访问一个…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…

【canal 中间件】canal 常见的启动方式

文章目录 一、安装 canal-admin1.1 拉取镜像1.2 启动 canal-admin 容器(使用脚本)1.2.1 下载脚本1.2.2 执行脚本1.2.3 初始化元数据库(可选) 1.3 启动 canal-admin 容器(直接使用 Docker 命令)1.3.1 启动容器1.3.2 查看启动日志 1.4 访问页面 二、 安装 canal-server2.1 拉取镜…

Python复习1:

一、数据类型 1.数字:int、float、bool 2.字符串:string 3.列表:list 4.集合:set 5.字典:dictionary 二、Test 1.print输出固定格式 num110 str1"hello world" #输出的固定格式 print("num1%d&…

不容错过的10个CSS与JS悬停效果,提升网站互动性

文章目录 前言正文1.悬停时照片效果2.快速强大的图像效果3.悬停标题滑出效果4.展示你的照片效果5.现实扭曲悬停效果6.分割图像悬停效果7.简约优雅图像效果8.动态图像效果9.大图像悬停画廊10.图像揭示效果 总结 前言 悬停效果是一种简单有效的网页互动方式,尤其在图…

微服务设计模式 — 补偿事务模式(Compensating Transaction Pattern)

微服务设计模式 — 补偿事务模式(Compensating Transaction Pattern) 定义 在云计算和分布式系统中,管理跨多个微服务或组件的事务一致性是一项极具挑战性的任务,补偿事务模式Compensating Transaction Pattern)是一种…

Java学习Day58:相声二人组!(项目统计数据Excel图表导出)

<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/html"><head><!-- 页面meta --><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>瑞通健康</tit…

Java实战项目-基于SpringBoot+Vue的二手车交易系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

gulp入门教程5:node-glob

node-glob模块简介 node-glob是一个基于Node.js的文件匹配库&#xff0c;它允许用户使用类似于shell的通配符&#xff08;如*和**&#xff09;来匹配文件路径。这个库基于JavaScript&#xff0c;使用了minimatch库来进行匹配。node-glob在处理大型项目中的文件匹配任务时非常有…

[mysql]数据定义语言DDL和数据操作语言DCL

目录 前文提要 数据定义语言DDL 数据操作语言DML 数据控制语言DCL 基础知识: 标识符(命名规则): 数据定义语言DDL 创建和管理数据库.: 管理数据库 切换数据库 修改数据库 更改数据库字符集 删除数据库 如何创建表 方式1:”白手起家的方式”创建表 方式2:已经有…

[NOIP2006 普及组] 明明的随机数

题目描述 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到 1000 之间的随机整数 (N≤100)&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同的数去掉&#xff0c;不同的数对应着不同…

webpack使用详解

摘要&#xff1a;webpack作为一款主流的构建工具&#xff0c;对比后来者Vite虽然存在一些缺点&#xff0c;例如启动慢&#xff0c;配置复杂等。在很多项目中使用依然基于webpack构建&#xff0c;有必要掌握其概念、构建流程和配置方法。 1 webpack概述 1.1 基本概念 webpack …

基于YOLO11/v10/v8/v5深度学习的维修工具检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

找树根和孩子c++

题目描述 给定一棵树&#xff0c;输出树的根root&#xff0c;孩子最多的结点max以及他的孩子 输入 第一行&#xff1a;n&#xff08;0<结点数<100&#xff09;&#xff0c;m&#xff08;0<边数<200&#xff09;。 以下m行&#xff1b;每行两个结点x和y&#xf…

Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者

近期&#xff0c;《黑神话&#xff1a;悟空》的爆火不仅让 AAA 游戏重回焦点&#xff0c;也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈&#xff0c;对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题&#xff0c;尤其在当前加密市场环…

数据挖掘(七)

数据挖掘&#xff08;七&#xff09; 文章目录 数据挖掘&#xff08;七&#xff09;加载数据集用现有模型进行分类构建网络 寻找子图连通分支 社交网络具有很高的商业价值&#xff0c;比如QQ、微信等拥有大量活跃用户的应用&#xff0c;通过投放广告可以获得不菲的收入。对于网…

深度学习-迁移学习

深度学习中的迁移学习是通过在大规模数据上训练的模型&#xff0c;将其知识迁移到数据相对较少的相关任务中&#xff0c;能显著提升目标任务的模型性能。 一、迁移学习的核心概念 源任务&#xff08;Source Task&#xff09;与目标任务&#xff08;Target Task&#xff09;&…

H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

说明&#xff1a; 很多IC厂家仅发布了内部Flash算法文件&#xff0c;并没有提供读写保护算法文件&#xff0c;也就是选项字节算法文件&#xff0c;需要我们制作。 实际上当前已经发布的TOOL版本&#xff0c;已经自制很多了。但是依然有些厂家还没自制&#xff0c;所以陆续开始…

flutter 写个简单的界面

起因&#xff0c; 目的: 来源: 客户需求。 着急要&#xff0c;我随便写的&#xff0c;应付一下。 过程: 略&#xff0c;直接看代码&#xff0c;看注释。 代码 1 xxx import package:flutter/material.dart;void main() {runApp(const MyApp()); }// # class MyApp extends…