Rust - 结构体基本使用
基础代码示例
为了理解何时需要使用结构体,官方文档给了一个案例,就是计算长方形的面积,这里我们会一步一步的重构代码直到使用结构体为止。
计算长方形的面积的具体逻辑就是获取长方形的宽度和高度,然后通过公式计算出长方形的面积,如下代码示例:
fn main() {let width = 10;let height = 20;println!("长方形的面积是{}", area(width, height))
}fn area(width: u32, height: u32) -> u32{width * height
}
通过cargo run运行程序后可以得到如下结果:
长方形的面积是200
虽然上述代码可以运行,并且在调用area函数时通过传入长方形的长和宽可以计算出长方形的面积,但是宽度和高度是相关联的,这个问题尤其体现在area函数的签名上,虽然area可以计算长方形的面积,但是参数却有两个。这两个参数本应相互关联,但是程序本身并没有体现出这一点,如果可以将长度和宽度组合在一起就可以更易懂也更易处理了。因此我们可以使用元组进行代码重构。
fn area(width: u32, height: u32) -> u32
使用元组重构代码
使用元组重构的代码示例如下:
fn main() {let tup_w_h = (10, 20); // 索引0对应宽度println!("长方形的面积是{}", area(tup_w_h))
}fn area(tup_w_h: (u32, u32)) -> u32{tup_w_h.0 * tup_w_h.1
}
元组版本的代码比基础代码更好一些,帮助我们增加一些结构性,而且area只需要传递一个参数即可,但是这个版本的代码有一点不是非常明确:就是元组并没有给出元素的名称,只能通过索引获取元组的每一部分,虽然在计算面积时将长宽弄混无关紧要但是如果在屏幕上绘制就会出现很大问题了,就必须搞清楚元组中哪个元素是长哪个是宽,这样就很容易混淆而造成错误,原因就是没有在代码中传达数据所代表的意义。
使用结构体重构代码
现在我们就可以使用结构体为数据命名赋予意义,可以将元组转换成一个有整体名称而且每个部分也有对应名字的数据类型-结构体:
struct WidthHeight {width: u32,height: u32,
}fn main() {let tup_w_h = WidthHeight {width: 10, height: 20}; // 索引0对应宽度println!("长方形的面积是{}", area(&tup_w_h))
}fn area(width_height: &WidthHeight) -> u32{width_height.height * width_height.width
}
上面的示例代码中定义了结构体WidthHeight,在在大括号中定义了字段 width 和 height,类型都是 u32。接着在 main 中,我们创建了一个具体的 WidthHeight 实例。
函数 area 现在被定义为接收一个名叫 width_height 的参数,其类型是一个结构体 WidthHeight 实例的不可变借用。前面的文章提到,我们希望借用结构体而不是获取它的所有权,这样 main 函数就可以保持 tup_w_h 的所有权并继续使用它,所以这就是为什么在函数签名和调用的地方会有 &。
area 函数访问 WidthHeight 实例的 width 和 height 字段。area 的函数签名现在明确的阐述了我们的意图:使用 WidthHeight 的 width 和 height 字段,计算 WidthHeight 的面积。这表明宽高是相互联系的,并为这些值提供了描述性的名称而不是使用元组的索引值 0 和 1 。结构体胜在更清晰明了。
相关文章:
Rust - 结构体基本使用
基础代码示例 为了理解何时需要使用结构体,官方文档给了一个案例,就是计算长方形的面积,这里我们会一步一步的重构代码直到使用结构体为止。 计算长方形的面积的具体逻辑就是获取长方形的宽度和高度,然后通过公式计算出长方形的…...
29. Kubernetes 核心组件讲解——Controller Manager
本章讲解知识点 Controller Manager 概述Replication ControllerNode ControllerResourceQuota ControllerNamespace ControllerService Controller 与 Endpoint Controller1. Controller Manager 概述 1.1 基本概念 一般来说,智能系统和自动系统通常会通过一个“操作系统”…...
BetaFlight统一硬件配置文件研读之feature命令
BetaFlight统一硬件配置文件研读之feature命令 1. 源由2. 代码分析3. 实例分析4. 配置情况4.1 feature4.2 feature list4.3 feature feature_name4.4 feature -feature_name 5. 参考资料 统一硬件配置文件的设计是一种非常好的设计模式,可以将硬件和软件的工作进行解…...
ChatGPT 不好用?那你看下这份 Prompt 工程指南
作为大型语言模型接口,ChatGPT 生成的响应令人刮目相看,然而,解锁其真正威力的关键还是在于提示工程。 在本文中,我们将揭示制作提示的专家级技巧,以生成更准确、更有意义的响应。无论你使用 ChatGPT 是为了服务客户、…...
冲浪杂记——
华为od是指什么? 华为OD(Open Developer Platform)是华为面向全球开发者推出的开放平台,旨在为开发者提供丰富的技术资源和开发工具,支持开发者快速构建基于华为技术的应用程序、解决方案和服务。华为OD平台为开发者提…...
深入理解Python中的进程与线程
前言 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而…...
Data retry场景介绍
本文介绍PDN激活失败或者IP Address缺失时的处理机制。 终端是否会retry? 如何设置data retry timer? Modem retry还是上层应用发起retry? IPV4V6 Fallback 3GPP TS 24.008 6.1.3.1定义了UE使用IPV4V6 pdp type建PDN失败后,如果网络以#Cause50、#Cause51或者#Cause52 …...
lua | 数组与迭代器的使用
目录 一、数组 一维数组 多维数组 二、迭代器 泛型for迭代器 无状态的迭代器 多状态的迭代器 本文章为笔者学习分享 学习网站:Lua 基本语法 | 菜鸟教程 一、数组 数组:相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数…...
【云原生】云原生服务网格流量控制思考
文章目录 前言一、什么是流量控制?二、存在三种场景三、场景分析 前言 随着云原生技术的不断发展及应用,很多服务都已部署上云。 保障云上环境的稳定是重要的一环。 一个重要的影响稳定的场景就是突发大流量冲击。 面对该场景,较好的应对…...
《数据库的嵌套查询和统计查询》
选择Study数据库,用SQL语句进行以下查询操作。 1.嵌套查询 ①求选修了数据结构的学生学号和成绩。 SELECT Sno, grade FROM sc WHERE Cno 007;②求007课程的成绩高于于文轩的学生学号和成绩。 SELECT Sno, grade FROM sc WHERE Cno 007 AND grade …...
【网站架构】Nginx 4层、7层代理配置,正向代理、反向代理详解
大家好,欢迎来到停止重构的频道。 本期我们讨论网络代理。 在往期《大型网站 安全性》介绍过,出于网络安全的考虑,一般大型网站都需要做网络区域隔离,以防止攻击者直接操控服务器。 网站系统的应用及数据库都会放在这个网络安全…...
mysql备份和恢复
mysql备份和恢复 数据丢失的原因: 程序错误 人为操作错误 运算错误 磁盘故障 灾难(火灾,地震)和盗窃 数据库备份分类 物理备份 数据库此操作系统的物理文件(数据文件,日志文件等)的备份 …...
新闻月刊 | GBASE 4月市场动态一览
产品动态 4月,GBASE南大通用大规模分布式并行数据库GBase 8a MPP Cluster中标人保财险“2022年基础软件产品及服务采购”项目。这是自2019年GBASE与人保财险达成合作以来支持建设的第三期项目。项目上线后,将极大满足人保财险大数据中心及研发中心的增量…...
Java --- springboot2数据响应与内容协商
目录 一、数据响应与内容协商 1.1、响应json 1.1.1、返回值解析器 1.1.2、springMVC支持的返回值类型 1.1.3、HttpMessageConverter原理 1.2、内容协商 1.2.1、引入依赖 1.2.2、 postman分别测试返回json和xml 1.2.3、开启浏览器参数方式内容协商功能 1.3、自定义 Message…...
“中特估”乘风破浪!后续机遇在哪?
5月第一个交易日,“中特估”继续乘风破浪,A股银行板块集体大涨。 随着新一轮国企改革正在推进,中特估体系也在积极构建之中。在市场缺乏增量资金背景下,市场选股范式已经转向数字经济AI、央国企价值重估的两条主线,此…...
OpenShift 4 - 在 CI/CD Pipeline 中创建 KubeVirt 容器虚拟机 - 方法3
《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 文章目录 创建并运行 CI/CD Pipeline访问 VMPipeline 的 Task 解读 创建并运行 CI/CD Pipeline 执行命令,生成公钥-私钥对。 $ ssh-keygen$ l…...
功率放大器在Lamb波信号波包模型验证研究中的应用
实验名称:窄带激励条件下的兰姆波时域信号参数估计研究 研究方向:Lamb波 测试目的: 基于Lamb波的二阶频散理论,提出了时域信号的波包模型,为全文奠定理论基础。模型考虑两种情况:初始激励以单模态传播和…...
Apache Hadoop
一、Apache Hadoop入门 1.1、Hadoop介绍 狭义上:hadoop指的是Apache一款java开源软件,是一个大数据分析处理平台。 Hadoop HDFS:分布式文件系统。 解决了海量数据存储问题。 Hadoop Distributed File System (HDFS™)Hadoop MapReduce&…...
PHP+vue大学生心理健康评价和分析系统8w3ff
本整个大学生心理健康管理系统是按照整体需求来实现各个功能的,它可以通过心理健康测评来检测大学生的心理健康,并且给予预警,还可以预约医生来解决问题。并且,管理员可以查看用户信息,发布一些关于心理健康的文章。该…...
【图像分割】【深度学习】SAM官方Pytorch代码-Mask decoder模块MaskDeco网络解析
【图像分割】【深度学习】SAM官方Pytorch代码-Mask decoder模块MaskDeco网络解析 Segment Anything:建立了迄今为止最大的分割数据集,在1100万张图像上有超过1亿个掩码,模型的设计和训练是灵活的,其重要的特点是Zero-shot(零样本迁…...
保姆级教程:在STM32CubeIDE项目中集成SEGGER RTT,并用J-Scope抓取波形
STM32CubeIDE实战:SEGGER RTT与J-Scope联调全攻略 在嵌入式开发中,实时观测变量变化是调试过程中不可或缺的一环。传统调试方法如串口打印或断点调试往往存在效率低下或干扰系统运行的问题。本文将手把手教你如何在STM32CubeIDE项目中集成SEGGER RTT技术…...
如何在Vue项目中快速实现Office文档预览:vue-office完整指南
如何在Vue项目中快速实现Office文档预览:vue-office完整指南 【免费下载链接】vue-office 支持word(.docx)、excel(.xlsx,.xls)、pdf、pptx等各类型office文件预览的vue组件集合,提供一站式office文件预览方案,支持vue2和3,也支持…...
MNN移动端推理引擎:从模型转换到部署优化的全链路实践
1. 项目概述:移动端推理引擎的“硬核”突围如果你在移动端或者边缘设备上折腾过AI模型部署,大概率经历过这样的痛苦:好不容易在云端训练好的模型,想放到手机或者嵌入式设备上跑起来,却发现要么速度慢如蜗牛,…...
2025最权威的AI辅助论文方案解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 全方位提升文本致然度和原创性是降低AIGC率的关键所在,第一步,杜绝直…...
打造你的专属数字伙伴:3步开启桌面宠物创作之旅 [特殊字符]
打造你的专属数字伙伴:3步开启桌面宠物创作之旅 🎨 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 你是否曾经梦想过在单调的电脑桌面上拥有一个会动、会互…...
AI原生安全CLI实战指南:Zypheron安装、配置与攻防工作流解析
1. 项目概述:一个为实战而生的AI原生安全CLI如果你和我一样,常年泡在终端里,每天和各种扫描器、漏洞库、报告打交道,那你肯定也烦透了那种“脚本小子”式的工作流:一个工具输出一堆原始日志,再手动扔给另一…...
终极指南:如何用RPFM革命性工具高效开发全面战争模组
终极指南:如何用RPFM革命性工具高效开发全面战争模组 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gitc…...
AI OS:从聊天到执行的AI辅助开发范式转变
1. 项目概述:从“聊天伙伴”到“执行团队”的AI范式转变如果你和我一样,在过去一年里深度使用过Cursor、Claude或者ChatGPT来辅助开发,那你一定经历过这种“甜蜜的烦恼”:AI能给出惊艳的代码片段,但当你试图让它帮你构…...
法律AI实战:基于OpenCLAW构建破产法智能辅助系统
1. 项目概述与核心价值最近在整理一些法律实务相关的工具和资源,发现了一个挺有意思的项目,叫“zhang-bankruptcy-law”。虽然项目描述和正文信息不多,但从项目名称和关键词来看,这应该是一个聚焦于中国破产法领域的知识库或技能工…...
终极解决方案:用代码绘图插件让Draw.io效率提升300%的完整指南
终极解决方案:用代码绘图插件让Draw.io效率提升300%的完整指南 【免费下载链接】drawio_mermaid_plugin Mermaid plugin for drawio desktop 项目地址: https://gitcode.com/gh_mirrors/dr/drawio_mermaid_plugin 还在为技术文档中的图表绘制而烦恼吗&#x…...
