【Rust】结构体定义域实例化

目录

思维导图

1. 结构体的定义与实例化

1.1 结构体的基本概念

1.2 定义结构体

1.3 创建结构体实例

1.4 结构体的定义与实例化示例 

2. 访问与修改结构体字段

2.1 访问字段

2.2 修改字段

3. 结构体实例的构造函数

3.1 构造函数的定义

3.2 使用字段初始化简写

4. 结构体更新语法

4.1 更新语法的使用

5. 元组结构体

5.1 元组结构体的定义

6. 单元结构体

6.1 单元结构体的定义

7. 结构体数据的所有权

7.1 数据所有权的重要性


思维导图

1. 结构体的定义与实例化

1.1 结构体的基本概念

  • 结构体是一种自定义数据类型,允许将多个相关的值组合在一起,形成一个有意义的集合。与元组不同,结构体的每个字段都有名称,这使得数据的访问和操作更加直观和清晰。

  • 结构体的灵活性体现在其命名字段上,开发者无需依赖字段的顺序来访问数据,从而减少了错误的可能性。

1.2 定义结构体

  • 使用struct关键字定义结构体,并为其命名。结构体名称应具有描述性,能够清晰地表达其代表的含义。

  • 在大括号内定义字段的名称和类型。字段的类型可以是Rust中的任意数据类型,包括基本类型、复合类型或其他结构体。例如:
    struct User {active: bool,username: String,email: String,sign_in_count: u64,
    }
    

1.3 创建结构体实例

  • 创建结构体实例时,需要为每个字段指定具体值,可以不按照定义时的顺序。例如:
    let user1 = User {active: true,username: String::from("someusername123"),[5]email: String::from("someone@example.com"),[5][6]sign_in_count: 1,
    };
    

1.4 结构体的定义与实例化示例 

struct User {active: bool,username: String,email: String,sign_in_count: u64,
}fn main() {// 创建结构体实例let user1 = User {active: true,username: String::from("someusername123"),email: String::from("someone@example.com"),sign_in_count: 1,};// 访问字段println!("User1: {}, {}, ({}), {}",user1.active, user1.username, user1.email, user1.sign_in_count);
}

2. 访问与修改结构体字段

2.1 访问字段

  • 使用点表示法(.)访问结构体实例的字段。例如,user1.email可以获取用户的电子邮件地址。

2.2 修改字段

  • 如果结构体实例是可变的(即使用mut关键字声明),可以通过点表示法修改字段的值。例如:
    struct User {active: bool,username: String,email: String,sign_in_count: u64,
    }fn main() {// 创建可变结构体实例let mut  user1 = User {active: true,username: String::from("someusername123"),email: String::from("someone@example.com"),sign_in_count: 1,};//修改字段user1.email = String::from("anotheremail@example.com");// 访问字段println!("updated User1: {}, {}, ({}), {}",user1.active, user1.username, user1.email, user1.sign_in_count);
    }

3. 结构体实例的构造函数

3.1 构造函数的定义

  • 可以定义一个函数来返回结构体实例,这种函数通常称为构造函数。例如,以下build_user函数用于创建User实例:
    struct User {active: bool,username: String,email: String,sign_in_count: u64,
    }fn main() {// 定义构造函数fn build_user(email: String, username: String) -> User {User {active: true,username,email,sign_in_count: 1,}}// 使用构造函数创建实例let user1 = build_user(String::from("someone@example.com"),String::from("someusername123"),);// 访问字段println!("User1: {}, {}, ({}), {}",user1.active, user1.username, user1.email, user1.sign_in_count);
    }

3.2 使用字段初始化简写

  • 当函数参数与结构体字段同名时,可以使用字段初始化简写语法,避免重复代码。例如,username: username可以简写为username

4. 结构体更新语法

4.1 更新语法的使用

  • 结构体更新语法允许基于现有实例创建新实例,同时仅修改部分字段。例如:
    let user2 = User {email: String::from("another@example.com"),[5]..user1
    };
    
  • 在上述代码中,user2继承了user1的所有字段值,但email字段被更新为新值。

5. 元组结构体

5.1 元组结构体的定义

  • 元组结构体是一种特殊的结构体,它没有命名字段,仅有字段类型。元组结构体适用于需要为整个元组命名的场景。例如:
    struct Color(i32, i32, i32);[10]
    struct Point(i32, i32, i32);[10]
    
  • 元组结构体的实例可以通过索引访问字段,例如let black = Color(0, 0, 0);

6. 单元结构体

6.1 单元结构体的定义

  • 单元结构体是一种没有字段的结构体,类似于单元类型()。它通常用于实现某些特征(trait)而不需要存储数据。例如:
    struct AlwaysEqual;fn main() {let subject = AlwaysEqual;
    }

7. 结构体数据的所有权

7.1 数据所有权的重要性

  • 在结构体中使用拥有所有权的类型(如String)而非引用类型(如&str),可以确保每个结构体实例拥有其数据的所有权,从而避免生命周期管理的复杂性。

  • 如果需要在结构体中使用引用类型,则必须显式指定生命周期参数,以确保引用的有效性。这将在后续章节中详细讨论。

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

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

相关文章

vue2修改表单只提交被修改的数据的字段传给后端接口

效果: 步骤一、 vue2修改表单提交的时候,只将修改的数据的字段传给后端接口,没有修改得数据不传参给接口。 在 data 对象中添加一个新的属性,用于存储初始表单数据的副本,与当前表单数据进行比较,找出哪些…

Docker 安装开源的IT资产管理系统Snipe-IT

一、安装 1、创建docker-compose.yaml version: 3services:snipeit:container_name: snipeitimage: snipe/snipe-it:v6.1.2restart: alwaysports:- "8000:80"volumes:- ./logs:/var/www/html/storage/logsdepends_on:- mysqlenv_file:- .env.dockernetworks:- snip…

迁移WSL中的ext4.vhdx文件

文章目录 环境前言过程参阅 环境 Windows11(WSL2) 前言 今天发现系统C盘的磁盘空间已经严重不足,查找后发现有一个很大的 ext4.vhdx 文件,位置在: C:\Users\ljfro\AppData\Local\Packages\CanonicalGroupLimited.U…

Windows 11更新之后卡顿 (黑神话掉帧严重)问题探索

前提 Windows 11 晚上更新完 24h2 之后,第二天玩黑神话,才40多帧 之前开启插针,可以运行到 120 帧左右 我的配置 9600X 3080 版本退回 用系统自带的 goBack 版本退回 大概不到3分钟 帧数还是不对,于是重做了系统 重做系统 …

50_Lua垃圾回收

1.Lua垃圾回收机制概述 Lua采用了一种自动内存管理机制,称为垃圾回收(Garbage Collection, GC)。垃圾回收的主要目的是回收程序中不再被使用的内存,从而避免内存泄漏。Lua的垃圾回收器负责回收动态分配的对象,如函数、用户数据、表、字符串、线程、内部结构等。Lua的垃圾…

[云原生之旅] K8s-Portforward的另类用法, 立省两个端口

前言 此方法适用于Pod不需要大量连接的情况: 有多个pod在执行任务, 偶尔需要连接其中一个pod查看进度/日志;对pod执行一个脚本/命令; 不适用于大量连接建立的情况: pod启的数据库服务;pod启的Api服务;pod启的前端服务;pod启的Oss服务; Portforward简介 Portforward就是端…

Spring Boot 动态表操作服务实现

Spring Boot 动态表操作服务实现 Spring Boot 动态表操作服务实现1. 环境配置2. JdbcTemplate 的使用2.1 创建动态表2.2 动态添加字段2.3 动态删除字段2.4 动态修改字段类型2.5 删除表的方法实现 3. 小结3.1 可能的优化 Spring Boot 动态表操作服务实现 在现代的应用开发中&am…

宁德时代C++后端开发面试题及参考答案

请阐述面向对象的三大特性。 面向对象编程有三大特性,分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起,对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节,只暴露必要的接口给外部。例如,我…

【Linux系统】—— vim 的使用

【Linux系统】—— vim 的使用 1 vim 的基本概念2 vim 的多模式3 命令模式下的命令集3.1 进入/退出其他模式3.2 光标移动命令集3.3 复制/剪切/粘贴/删除命令集3.4 撤销命令集3.5 查找命令集3.6 替换命令集3.7 进入与退出替换模式 4 批量化编译5 底行模式6 vim 小技巧7 vim简单配…

C++11新特性:aligned_storage等空间分配工具

C11对于内存对齐的支持 对齐的数据有助于提高内存的访问效率以及减少程序运行期间因为内存未对齐导致硬件抛出错误的可能。因此在c中,数据的对齐是必不可少的,对于系统而言在默认情况下也是坚持数据对齐这一准则的。关于内存对齐的详细内容可见《C 内存对…

机器学习数据预处理preprocessing

预处理方法预处理方法预处理方法BinarizerFunctionTransformerKBinsDiscretizerKernelCentererLabelBinarizerLabelEncoderMaxAbsScalerMinMaxScalerMultiLabelBinarizerNormalizer OneHotEncoderOrdinalEncoderPolynomialFeaturesPowerTransformerQuantileTransformer sklear…

3D滤波器处理遥感tif图像

import cv2 import numpy as np from osgeo import gdal# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # …

UnityXR Interaction Toolkit 如何检测HandGestures

前言 随着VR设备的不断发展,从最初的手柄操作,逐渐演变出了手部交互,即头显可以直接识别玩家的手部动作,来完成手柄的交互功能。我们今天就来介绍下如何使用Unity的XR Interaction Toolkit 来检测手势Hand Gesture。 环境配置 1.使用Unity 2021或者更高版本,创建一个项…

Qt 中使用 moveToThread 多线程踩坑记录

关于QT Widget 其它文章请点击这里: QT Widget 今天在使用 Qt 的 moveToThread 实现多线程时,遇到了两个常见的坑,在这里记录一下,供自己和大家参考。 一、继承于QWidget 的控件不能在子线程中运行 Qt 的规定是:所有 UI 操作…

Unity Protobuf实践

官方文档:https://protobuf.com.cn/overview/ 1. 获取Protobuf: 1.1 通过NuGet包管理器: 拷贝dll: 选择.net2.0的dll: 导入Unity Plugins目录: 1.2 下载源码并生成dll: GitHub - protocolbuf…

【微服务】面试 4、限流

微服务限流技术总结 一、微服务业务面试题引入 在微服务业务面试中,限流是重要考点,常与分布式事务、分布式服务接口幂等解决方案、分布式任务调度等一同被考查。面试官一般会询问项目中是否实施限流及具体做法,回答需涵盖限流原因、采用的方…

Java Bean Validation 不适用Spring的情况下自定义validation注解

Java Bean Validation(也称为 JSR 380,为 Bean Validation 2.0 规范)提供了一套基本的注解,用于定义和验证 Java Bean 的属性。例如: NotNull:属性不能为空 Size:字符串、集合或数组的大小有约…

VScode 配置 C语言环境

遇到的问题集合 mingw官方下载网站(https://sourceforge.net/projects/mingw-w64/files/)更新之后,与网上大多数教程上写的界面不同了。 网上大多数教程让下载这个: 但是现在找不到这个文件。 写hello.c文件时,报错&…

语音技术与人工智能:智能语音交互的多场景应用探索

引言 近年来,智能语音技术取得了飞速发展,逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制,再到企业客服和教育辅导,语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后,人工智能技术无疑是关键…

前端依赖安装指南

前端依赖安装指南 一、NVM管理工具安装 1.在 Windows 上安装 下载 NVM for Windows 的安装程序:(最新版本可以在 nvm-windows Releases 页面 找到)运行下载的安装程序并按步骤操作。 2.配置 NVM exe安装自动配置环境变量 3. 验证 NVM 安装 验证 NVM 是否成功…