【Rust】第六节:结构体

0 前言

结构体,struct,听到这个名字大家可能会感觉“哇!好熟悉!”,毕竟在大学时学习c/cpp的时候已经接触过很多次了,实际上也确实很类似,即使有些不同,比如“所有权系统”(上一节提到了)、“生命周期”(还没提到)、“模式匹配”(也很熟悉吧)、Trait(还没提到),也大多数是在更后面才会提到。
总体来讲,Ruststruct在语法上与c/cpp类似,但因入了一些新的概念和特性,提供更高级、更安全的编程体验,不过这一节只是认识struct,所以学起来会比较轻松。

原文链接:Rust程序设计语言


1 定义与实例化

让我们来定义和实例化一个结构体

// 1 定义
struct User {active: bool,username: String,email: String,sign_in_count: u64,
}fn main() {// 2 实例化let user0 = User {email: String::from("someone@example.com"),username: String::from("someusername123"),active: true,sign_in_count: 1,}; // 整个不可变// 3 实例化可变let mut user1 = User {email: String::from("someone@example.com"),username: String::from("someusername123"),active: true,sign_in_count: 1,}; // 整个可变,不能部分可变// 4 可变user1.email = String::from("anotheremail@example.com");// 5 简便实例化// 使用结构体更新语法从其他实例创建实例let user2 = User {email: String::from("another@example.com"),..user1 // 必须放在最后};
}// 6 函数创建
fn build_user(email: String, username: String) -> User {User {// 7 简洁创建email, // 字段初始化的简洁写法username,active: true,sign_in_count: 1,}
}

除了以上方式,还可以没有明明字段的方式来创建,比如:

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

但是要注意,虽然ColorPoint的内容看起来一样,但他们是不同的类型!如果你一个函数,入参设定为Color,那么不能用Point

不过,有一个比较复杂的内容是,“所有权”,“可以使结构体存储被其他对象拥有的数据的引用,不过这么做的话需要用上生命周期(lifetime)”,这一点内容会在后面笔记中再展开。


2 示例程序

在这一部分,可以注意:
1、结构体定义
2、创建实例
3、impl关联函数
4、多个关联函数
5、非方法
6、dbg调试
7、函数调用,含入参

#[derive(Debug)] // 调试
// 结构体
struct Rectangle {width: u32,height: u32,
}// 关联函数
impl Rectangle {// self使用,注意"&self"fn area(&self) -> u32 {self.width * self.height}// 更多的函数fn can_hold(&self, other: &Rectangle) -> bool {self.width > other.width && self.height > other.height}
}
// 多个关联函数 is ok
impl Rectangle {// 不以self为第一参数的关联函数(不是方法)// 因为他们并不作用于一个结构体的实例,而是在类型上定义的,就像`String::from`// 需要以结构体名和::语法来调用,见下文fn square(size: u32) -> Rectangle {Rectangle {width: size,height: sieze,}}
}fn main() {let rect1 = Rectangle {width: 30,height: 50,};dbg!(&rect1); // 如果你对调试有兴趣,请阅读原文let rect2 = Rectangle {width: 10,height: 40,};let rect3 = Rectangle {width: 60,height: 45,};// 方法调用println!("The area of the rectangle is {} square pixels.",rect1.area());// 方法调用、参数传入println!("Can rect1 hold rect2 ? {}", rect1.can_hold(&rect2));// 不是方法,以此种方式调用let sq = Rectangle::square(3);
}

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

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

相关文章

字符金字塔(C语言刷题)

个人博客主页:https://blog.csdn.net/2301_79293429?typeblog 专栏:https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 请打印输出一个字符金字塔,字符金字塔的特征请参考样例 输入描述: 输入一个字母,保…

5.6 误差相关统计与计算

文章目录 1、平均值2、首次作为参考基准3、绝对差值4、方差、均方差、CV值4.1 方差(variance)4.2 均方差、标准差(Standard Deviation)4.3 CV值 1、平均值 Excel 公式:AVERAGE(C4:C20) 2、首次作为参考基准 Excel 操作…

docker面试题(一)

问题1:Docker的工作原理是什么? 答案1:Docker利用Linux内核的容器化技术,如命名空间(namespaces)和控制(cgroups),来实现应用程序的隔离和封装。它使用镜像作为构建和分…

02.Elasticsearch应用(二)

Elasticsearch应用(二) 1.ElasticSearch-head 参考链接 https://github.com/mobz/elasticsearch-head 是什么 ElasticSearch可视化工具,跟Kibana差不多 四种运行方式 第一种:使用内置服务器运行 git clone git://github.c…

ITSS服务工程师:开启IT职业生涯的金钥匙

🔥ITSS是中国电子技术标准化研究院推出的,涵盖了“IT服务工程师”和“IT服务经理”的系列培训。它不仅满足GB/T 28827.1的符合性评估要求,还助力IT服务资质升级。 🎯“IT服务工程师”培训从服务技术、服务技巧和服务规范三大板块&…

java复习篇 数据结构:链表第二节 哨兵

目录 单向链表哨兵 初始 头插 思路 代码 尾插 思路 遍历 遍历验证头插 尾插代码 尾插测试 get 思路 代码 测试 insert 思路 代码 测试 remove 移除头结点 提问 移除指定位置 测试 单向链表哨兵 单向链表里面有一个特殊的节点称为哨兵节点,…

ubuntu16程序kill后没有及时释放端口

当你在Ubuntu 16上使用kill命令结束一个程序后,如果该程序正在使用的端口没有被及时释放,可能是因为该程序在被结束时还有连接处于活动状态,系统会等待这些连接自然结束。 如果你想强制快速释放该端口,可以使用以下步骤&#xff…

C# AsyncLocal 是如何实现 Thread 间传值

一:背景 1. 讲故事 这个问题的由来是在.NET高级调试训练营第十期分享ThreadStatic底层玩法的时候,有朋友提出了AsyncLocal是如何实现的,虽然做了口头上的表述,但总还是会不具体,所以觉得有必要用文字图表的方式来系统…

AI时代的创新工具:如何利用AI生成独具个性的XMind思维导图?

哈喽,大家好,我是木头左,物联网搬砖工一名,致力于为大家淘出更多好用的AI工具! 背景 随着互联网的发展,越来越多的人开始使用Markdown来编写文档。Markdown是一种轻量级的标记语言,它允许人们使…

openssl3.2/test/certs - 031 - purpose variants: clientAuth

文章目录 openssl3.2/test/certs - 031 - purpose variants: clientAuth概述笔记END openssl3.2/test/certs - 031 - purpose variants: clientAuth 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! \file my_openssl_linux_log_doc_031.txt \note openssl3.2/tes…

强化数据资产管理,迎接数据资产 “入表” 新时代

2024年伊始,数据要素产业利好政策密集出台,数据资产“入表”成为了大势所趋。数据要素顶层设计方案加速落地,推动企业数字化转型提档加速,提升数据管理能力、实现数据资产价值成为企业下一阶段核心竞争力构建的关键。 01 数据资产…

pytorch与tensorflow如何选择?

目录 1.动态图和静态图1.1 tensorflow是静态图1.2 pytorch动态图 2. 易用性3. 编程语言4. 性能和扩展性5. 社区支持和生态系统 1.动态图和静态图 1.1 tensorflow是静态图 如上图: 定义计算图(公式,包括定义变量x,y ,zx*y)给公式…

Docker中安装 RabbitMQ

1、下载 RabbitMQ 镜像 下载最新版本的镜像: docker pull rabbitmq更多版本的镜像可以访问 Docker 官网:https://hub.docker.com/_/rabbitmq?tabtags 2、创建并运行 RabbitMQ 容器 启动命令: docker run -d -p 15672:15672 -p 5672:567…

垃圾回收小程序:环保与便捷的完美结合

一、引言 随着科技的发展,移动应用程序已经成为人们日常生活中不可或缺的一部分。其中,废品回收小程序以其独特的价值和功能,日益受到人们的关注和青睐。本文将探讨废品回收小程序开发的重要性、功能特点、技术实现和未来发展趋势。 二、废…

爬虫笔记(二):实战58二手房

第一:给大家推荐一个爬虫的网课哈,码起来 第二:今夜主题:通过xpath爬取58二手房的title信息,也就是标红的位置~ 第三:先分析一波title所在的位置 打开按下f12打开抓包工具,即可看到网站的源码…

【C++基础】认识回调函数

1. 什么是回调函数: 函数指针的调用,即是一个通过函数指针调用的函数; 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。 In co…

备考CSP-J—贪心

额……既然是备考,那么一定要动脑筋,一共5题,大家好好思考一下。 一:P1250 种树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二:P1020 [NOIP1999 提高组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn…

【笔记】Helm-4 最佳实践-2 values

values 最佳实践的该部分包括了values的使用。这部分指南中,我们提供了关于您如何构建和使用values的建议,以及专注于设计chart的values.yaml文件。 命名规范 变量名称以小写字母开头,单词按驼峰区分: 正确的: chic…

JVM-初始JVM

什么是JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: JVM的功能 1 - 解释和运行 2 - 内存管理 3 - 即时编译 解释和运行 解释…

【二】车载FrameWork添加系统服务

自定义系统服务 常见的AMS、PWS、WMS等等都是系统服务,运行于system_server进程,并且向servicemanager进程注册其Binder以便其他进程获取binder与对应的服务进行通信。为了新增自定义系统服务,我们可以参考AMS等原生系统服务编写如下文件&am…