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

devtools/2025/1/16 8:33:35/

目录

思维导图

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中的任意数据类型,包括基本类型、复合类型或其他结构体。例如:
    rust">struct User {active: bool,username: String,email: String,sign_in_count: u64,
    }
    

1.3 创建结构体实例

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

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

rust">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关键字声明),可以通过点表示法修改字段的值。例如:
    rust">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实例:
    rust">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 更新语法的使用

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

5. 元组结构体

5.1 元组结构体的定义

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

6. 单元结构体

6.1 单元结构体的定义

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

7. 结构体数据的所有权

7.1 数据所有权的重要性

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

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


http://www.ppmy.cn/devtools/150894.html

相关文章

一 rk3568 Android 11固件开发环境搭建 (docker)

一 目标 搭建 rk3568 android 系统内核 及固件开发编译调试环境, 支持开发环境导出分享 基于荣品 rk3568 核心板 系统环境: ubuntu22.04 /ubuntu20.04 64位桌面版 编译环境: docker + ubuntu20.04 , 独立的容器隔离环境,不受系统库版本冲突等影响,无性能损耗, 可…

【Vue3 入门到实战】3. ref 和 reactive区别和适用场景

目录 ​编辑 1. ref 部分 1.1 ref定义基本数据类型 1.2 ref 定义引用数据类型 2. reactive 函数 3. ref 和 reactive 对比 3.1 原理 3.2 区别 3.3 使用原则 在 Vue 3 中 ref 和 reactive 是用于创建响应式数据的两个核心函数。它们都属于 Composition API 的一部分&…

AD域的疑问以及参考

AD域的疑问以及解答 一、写在前面二、问题1、为什么AD域服务器的DNS要指向自己?2、为什么AD域的本地用户不见了3、域用户和域管理员分别可以添加多少台计算机4、为什么DN里面可以出现多个OU和多个DC,这是为什么?又代表什么意思?5、…

QT + Opencv 实现灰度模板匹配

QT Opencv 实现灰度模板匹配 实现思路 1.模板创建代码思路 1 初始化和准备: 使用 cv::buildPyramid 函数构建图像金字塔。图像金字塔是一种多分辨率表示,每个层级的图像分辨率逐步降低。 调整 m_TemplData 的大小以匹配图像金字塔的层级数。 计算每…

概率论考前一天

判断是不是分布函数:单调不减,右连续,F负无穷为0, F正无穷为1 判断是不是密度函数:非负性(函数任意地方都大于0),规范:积分为1

《机器学习》——DBSCAN算法

文章目录 DBSCAN算法简介DBSCAN算法原理核心概念聚类过程 DBSCAN模型模型API主要参数其他参数 DBSCAN算法实例实例步骤导入所需库导入数据文件传入变量DBSCAN聚类分析添加数据进原数据框对聚类结果进行评分 DBSCAN算法简介 DBSCAN(Density - Based Spatial Cluster…

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)

线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用,凭借uniapp 可以在h5 小程序 app…

Leetcode 967 Numbers With Same Consecutive Differences

题意 给定n,代表整数的长度,给定k代表两个相邻数字之间的间隔。求所有的值构成的组合 题目链接 https://leetcode.com/problems/numbers-with-same-consecutive-differences/description/ 题解 dfs,有k位置要选,第一个位置我…