Rust结构体的定义和实例化

1.结构体特点

Rust的结构体跟元组类型比较类似,它们都包含多个相关的值。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。

定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,一般称为 字段field)。

2.结构体定义和实例化

下面是一个结构体定义的示例:

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}

一旦定义了结构体后,为了使用它,通过为每个字段指定具体值来创建这个结构体的 实例。创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键 - 值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数据值。实例中字段的顺序不需要和它们在结构体中声明的顺序一致。换句话说,结构体的定义就像一个类型的通用模板,而实例则会在这个模板中放入特定数据来创建这个类型的值。

下面是一个结构体的应用示例:

fn main() {
    let mut user1 = User {
        active: true,
        username: String::from("suntiger"),
        email: String::from("suntiger@example.com"),
        sign_in_count: 1,
    };
​
    user1.email = String::from("anotheremail@example.com");
}

整体代码如下:

将代码进行编译, 可以发现email的内容被替换了,如图:

注意看接收结构体实例的user1变量, 前面有mut关键字, 这样方便我们修改结构体成员, 注意整个结构体实例必须是可变的, Rust不允许只将结构体的某个字段标记为可变。

3.在函数中使用结构体

先来看一段在函数中返回结构体实例的代码:

fn build_user(email: String, username: String) -> User {
    User {
        active: true,
        username: username,
        email: email,
        sign_in_count: 1,
    }
}

我们定义了一个build_user 函数,它返回一个带有给定的 email 和用户名的 User 结构体实例。active 字段的值为 true,并且 sign_in_count 的值为 1。需要注意同其他任何表达式一样,我们可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例。

4.字段初始化简化方式

为函数参数起与结构体字段相同的名字是可以理解的,但是不得不重复 emailusername 字段名称与变量会让人感到厌烦。如果结构体有更多字段,重复每个名称就更使人抓狂。还好Rust准备了简化的方法。

先看下面的代码:

fn build_user(email: String, username: String) -> User {
    User {
        active: true,
        username,
        email,
        sign_in_count: 1,
    }
}

参数名与字段名都完全相同,我们可以使用 字段初始化简写语法来重写 build_user,这样其行为与之前完全相同,无需在字段后面跟上相同名称的字段内容。

5.结构体更新语法

使用旧实例的大部分值但改变其部分值来创建一个新的结构体实例通常是很有用的。这可以通过结构体更新语法实现。

看下面的应用代码:

fn main() {
    let user2 = User {
        active: user1.active,
        username: user1.username,
        email: String::from("another@example.com"),
        sign_in_count: user1.sign_in_count,
    };
}

使用结构体更新语法,我们可以通过更少的代码来达到相同的效果,看下面的代码:

fn main() {
​
    let user2 = User {
        email: String::from("another@example.com"),
        ..user1
    };
}

.. 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。与此同时这段代码也在 user2 中创建了一个新实例,但该实例中 email 字段的值与 user1 不同,而 usernameactivesign_in_count 字段的值与 user1 相同。..user1 必须放在最后,以指定其余的字段应从 user1 的相应字段中获取其值,但我们可以选择以任何顺序为任意字段指定值,而不用考虑结构体定义中字段的顺序。

6.元组结构体

也可以定义与元组类似的结构体,称为 元组结构体。元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,元组结构体是很有用的,这时像常规结构体那样为每个字段命名就显得多余和形式化了。

要定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型。看下面这段代码:

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
​
fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
}

注意 blackorigin 值的类型不同,因为它们是不同的元组结构体的实例。我们定义的每一个结构体有其自己的类型,即使结构体中的字段可能有着相同的类型。例如,一个获取 Color 类型参数的函数不能接受 Point 作为参数,即便这两个类型都由三个 i32 值组成。在其他方面,元组结构体实例类似于元组,你可以将它们解构为单独的部分,也可以使用 . 后跟索引来访问单独的值,等等。

7.类单元结构体

我们也可以定义一个没有任何字段的结构体!它们被称为 类单元结构体, 因为它们类似于unit 类型。类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。

定义代码如下:

struct AlwaysEqual;
​
fn main() {
    let subject = AlwaysEqual;
}

要定义 AlwaysEqual,同样也使用 struct 关键字,然后后面跟想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 subject 变量中获得 AlwaysEqual 的实例:使用我们定义的名称,不需要任何花括号或圆括号。想象一下,我们将实现这个类型的行为,即每个实例始终等于每一个其他类型的实例,也许是为了获得一个已知的结果以便进行测试。我们不需要任何数据来实现这种行为。

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

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

相关文章

浅谈二叉树

✏️✏️✏️今天给大家分享一下二叉树的基本概念以及性质、二叉树的自定义实现,二叉树的遍历等。 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流&…

【CUDA编程--编程模型简介算子开发流程】

官方文档:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html 什么是CUDA CUDA全称(Compute Unified Device Architecture)统一计算架构,是NVIDIA推出的并行计算平台深度学习加速:对于神经网络&…

无线通信测量仪器-4945B/C 无线电通信综合测试仪

01 4945B/C 无线电通信综合测试仪 产品综述: 4945B/4945C无线电通信综合测试仪是多功能、便携式无线电综合测试类仪器,基于软件无线电架构,集成了跳频信号发生与分析、矢量信号发生与解调分析、模拟调制信号发生与解调分析、音频信号发生与…

C语言求数组中出现次数最多的元素

一、前言 遇到一个需求,需要求数组中出现次数最多的元素,查找了一些资料,结合自己的思路,编写了程序并验证。 只考虑元素为非负整数的数组,如果有出现次数相同的元素,则返回较小元素。 二、编程思路 以数…

python3+requests+unittest实战系列【二】

前言:上篇文章python3requestsunittest:接口自动化测试(一)已经介绍了基于unittest框架的实现接口自动化,但是也存在一些问题,比如最明显的测试数据和业务没有区分开,接口用例不便于管理等&…

AI主播“败走”双11,想用AI省成本的商家醒醒吧,程序员不必担心失业,发展空间依旧很大

目录 1 2 3 “AI人”并不算是新鲜事,随着AI的发展,AI主播也开始悄悄进入到直播间中。 持续无间断的直播、比人工费便宜等优势,让很多商家选择了AI主播。 AI主播到底好不好用?终于在今年“双11”现出了原形。 1 AI主播没火过半年…

Python常用插件之emoji表情插件的用法

目录 一、概述 二、安装 三、基本用法 四、高级用法 1、自定义emoji表情 2、使用表情符号列表 3、结合使用Emoji和输入文本 4、动态添加emoji表情 5、自定义Emoji的样式 总结 一、概述 在Python中,使用emoji表情已经成为了一种非常流行的趋势。许多开发者…

Linux Centos 根目录扩展分区(保级教程)

Centos 根目录扩展分区 1. 扩展背景2.列出磁盘信息3. 对磁盘进行分区4. 重启Linux5. 将PV加入卷组centos并分区6.查看分区结果 1. 扩展背景 虚拟机初始分配20G内存,扩容到80G。 2.列出磁盘信息 可以得知容量信息以及即将创建的PV路径(通常为“/dev/s…

tcpdump抓包的字节数量与ethtool统计数据不同的原因

情况介绍 在进行RDMA抓包流量分析时,我使用ethtool工具统计了RDMA网卡的流量发送数据数量,然后使用tcpdump进行抓包。 经过分析发现,tcpdump得到的数据数量总是大于ethtool得到的数据数量,而且每个数据包会多出4个字节。 分析 …

代码随想录算法训练营|五十一天

最长递增子序列 300. 最长递增子序列 - 力扣(LeetCode) 递推公式: 有点像双指针的操作,例如{2,5,6,4,3}(写不出来,画图) public class Solution {public int LengthOfLIS(int[] nums) {if (n…

如何计算掩膜图中多个封闭图形的面积

import cv2def calMaskArea(image,idx):mask cv2.inRange(image, idx, idx)contours, hierarchy cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for contour in contours:area cv2.contourArea(contour)print("图形的面积为", area) image是…

Git的GUI图形化工具ssh协议IDEA集成Git

一、GIT的GUI图形化工具 1、介绍 Git自带的GUI工具,主界面中各个按钮的意思基本与界面文字一致,与git的命令差别不大。在了解自己所做的操作情况下,各个功能点开看下就知道是怎么操作的。即使不了解,只要不做push操作&#xff0c…

【Python基础篇】字面量

博主:👍不许代码码上红 欢迎:🐋点赞、收藏、关注、评论。 格言: 大鹏一日同风起,扶摇直上九万里。 文章目录 一 Python中字面量的定义二 常见的字面量类型1 数字(Number)2 字符串(String)3 列表(List)4 元…

大模型深入发展,数字化基础设施走向“算粒+电粒”,双粒协同

AI大模型爆发,千行百业期待用生成式人工智能挖掘创新应用与提升生产力。不过,高效的大模型应用底层实际需要更灵活、多元的算力去支撑。在这个重要的技术窗口下,11月10日,由中国智能计算产业联盟与ACM中国高性能计算专家委员会共同…

十月份 NFT 市场显示复苏迹象,等待进一步的积极发展

作者: stellafootprint.network 10 月份,比特币价格大幅飙升,NFT 市场出现了复苏迹象,月度交易量和用户数均增长了 15.2%。尽管 10 月份的数据相比 9 月份有所改善,但仍然不及 8 月份和之前几个月的水平。因此,现在断…

一、认识微服务

目录 一、单体架构 二、分布式架构 三、微服务 1、微服务架构特征: 1.单一职责: 2.面向服务: 3.自治: 4.隔离性强: 2、微服务结构: 3、微服务技术对比: 一、单体架构 二、分布式架构 三…

洗地机哪个牌子最好用?洗地机品牌排行榜

近年来,洗地机相当热门,洗地机结合了扫地拖地吸地为一体的多功能清洁工具,让我们告别了传统方式打扫卫生,让我们清洁不再费劲,可是市面上的洗地机五花八门,怎么挑选到一个洗地机也是一个问题,下…

如果让你重新开始学 C/C++,你的学习路线会是怎么选择?

1. 第一阶段 学好 C 语言和 Linux 1.1 学好 C 语言 无论你是科班还是非科班,建议你一定要学好 C 语言,它应该作为你必须掌握好的语言。你要熟悉 C 语言的基本语法,包括: 顺序、条件、循环三大控制语句 C 中几大基元数据类型的用…

【文末送书】深入浅出嵌入式虚拟机原理

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

YashanDB服务端个人版安装部署

介绍 崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景,为客户提供一站式的企业级融合数据…