文章目录

    • Rust 定义与实例化结构体
      • 5.1 结构体的定义与意义
      • 5.2 结构体实例化
        • 5.2.1 基本实例化
        • 5.2.2 可变性规则
        • 5.2.3 字段初始化简写
        • 5.2.4 结构体更新语法
      • 5.3 特殊结构体类型
        • 5.3.1 元组结构体(Tuple Struct)
        • 5.3.2 类单元结构体(Unit-Like Struct)
      • 5.4 结构体的所有权与生命周期
        • 5.4.1 所有权规则
        • 5.4.2 引用字段与生命周期
      • 5.5 最佳实践与常见场景
      • 5.6 应用示例

Rust 定义与实例化结构体

Rust 结构体

结构体(struct)是Rust中组织和封装相关数据的核心工具。它通过命名字段将不同类型的数据组合成一个有意义的整体,提供比元组更清晰的语义和更强的类型安全性。本章将深入探讨结构体的定义、实例化及高级技巧。


5.1 结构体的定义与意义

结构体使用 struct 关键字定义,包含字段名和类型声明:

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

核心特点

  1. 语义明确性:字段名(如 username)直接描述数据含义,避免了元组依赖位置索引的歧义性。
  2. 类型安全:每个字段类型在编译时确定,确保内存安全。
  3. 灵活性:实例化时字段顺序无需与定义一致。

与元组的对比

特性结构体元组
字段访问点运算符(user.email索引(user.1
可读性高(命名字段)低(依赖位置)
类型组合支持异构类型支持异构类型

5.2 结构体实例化

5.2.1 基本实例化

通过键值对为字段赋值:

let user1 = User {  email: String::from("alice@example.com"),  username: String::from("alice92"),  active: true,  sign_in_count: 1,  
};  
5.2.2 可变性规则
  • 整体可变:使用 mut 声明整个实例可变,所有字段均可修改:
    let mut user1 = User { /* ... */ };  
    user1.email = String::from("new_email@example.com"); // 合法修改  
    
  • 禁止部分可变:Rust不支持单独标记某个字段可变(如 mut username)。
5.2.3 字段初始化简写

当变量名与字段名相同时,可省略重复赋值:

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

此语法减少冗余代码,提升可读性。

5.2.4 结构体更新语法

使用 .. 从现有实例复制未显式赋值的字段:

let user2 = User {  email: String::from("bob@example.com"),  ..user1 // 复制user1的其余字段  
};  

注意事项

  1. ..user1 必须置于末尾。
  2. 所有权转移:若复制的字段包含所有权类型(如 String),原实例的对应字段将失效:
    println!("{}", user1.username); // ❌ 错误!所有权已转移至user2  
    println!("{}", user1.active);   // ✅ 安全(bool实现Copy)  
    

5.3 特殊结构体类型

5.3.1 元组结构体(Tuple Struct)

定义时仅声明字段类型,无字段名:

struct Color(i32, i32, i32);  
struct Point(i32, i32, i32);  let black = Color(0, 0, 0);  
let origin = Point(0, 0, 0);  

特点

  • 类型区分ColorPoint 是不同类型,即使字段类型相同。
  • 访问方式:通过索引(如 black.0)或解构(let Color(r, g, b) = black;)访问字段。
5.3.2 类单元结构体(Unit-Like Struct)

无任何字段的结构体:

struct AlwaysEqual;  
let subject = AlwaysEqual;  

应用场景

  • 实现 trait 但无需存储数据(如标记类型)。
  • 泛型编程中的占位符。

5.4 结构体的所有权与生命周期

5.4.1 所有权规则

结构体默认拥有所有字段的所有权:

struct User {  username: String, // 拥有数据所有权  email: String,  // ...  
}  

优势:结构体失效时自动释放所有字段,避免内存泄漏。

5.4.2 引用字段与生命周期

若需在结构体中存储引用,必须使用生命周期注解:

struct UserBorrowed<'a> {  username: &'a str, // 引用外部数据  email: &'a str,  
}  

要求:引用的数据(如 String 变量)必须比结构体实例存活更久,否则导致悬垂引用。


5.5 最佳实践与常见场景

  1. 数据封装:将关联数据(如用户信息)组合为结构体,提升代码可读性。
  2. 类型安全抽象:用独立结构体区分语义不同的数据类型(如 UserId(u64)OrderId(u64))。
  3. 构建模式:通过构造函数(如 User::new())封装实例化逻辑。

下一章将涵盖结构体方法(impl 块)和关联函数,进一步扩展结构体的行为建模能力。

5.6 应用示例

struct User {username: String,email: String,sign_in_count: u64,active: bool,
}fn main() {let user1 = User {email: String::from("someone@example.com"),username: String::from("someusername123"),active: true,sign_in_count: 1,};println!("User 1: {} ({})", user1.username, user1.email);println!("Active: {}, Sign-in count: {}", user1.active, user1.sign_in_count);
}

demo


代码示例均通过 Rust 1.78 编译测试。深入实践可参考 The Rust Book 。

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

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

相关文章

ELK日志分析系统(filebeat+logstash+elasticsearch+kibana)

一、ELK 平台介绍 1、ELK 概述 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。…

JS基础4—jQuery

jQuery常用内容 jQuery 介绍jQuery 获取方式基本选择器 (最常用)层级选择器 (基于元素间关系)过滤选择器 (基于特定条件) jQuery事件绑定jQuery 方法调用jQuery遍历jQuery 获取与设置jQuery 添加与删除jQuery CSS 类jQuery - AJAX 总结 jQuery 介绍 jQuery 是一个轻量级、快速…

时钟周期是什么?

时钟周期&#xff08;Clock Cycle&#xff09;是什么&#xff1f; 时钟周期&#xff08;Clock Cycle&#xff09;是计算机系统中一个最基础的时间单位&#xff0c;也称为时钟节拍或时钟周期时间&#xff08;Clock Period&#xff09;。它由系统时钟发生器产生的一个周期性脉冲…

如何用SEO优化长尾关键词?

内容概要 在SEO优化领域&#xff0c;长尾关键词扮演着至关重要的角色&#xff0c;它们能有效提升网站在搜索引擎中的可见度和流量转化率。本文将全面解析如何通过系统方法优化长尾关键词&#xff0c;涵盖从基础理论到实战应用的完整流程。核心内容包括利用专业工具进行关键词挖…

电子面单系统开发全解析

一、如果要做电子面单系统&#xff0c;怎么做&#xff1f; 开发电子面单系统是一项复杂且涉及多方面考量的工程&#xff0c;涵盖需求分析、系统架构设计、技术选型、接口对接、安全性保障、第三方服务选择以及部署与维护等关键环节。 电子面单系统开发步骤 需求分析&#xf…

UE5 - 制作《塞尔达传说》中林克的技能 - 18 - 磁力抓取器

让我们继续《塞尔达传说》中林克技能的制作!!! UE版本:5.6.0 VS版本:2022 本章节的核心目标:磁力抓取器 先让我们看一下完成后的效果: 18_磁力抓取器 大纲如下: 引言功能架构与核心逻辑物理材质与场景配置代码实现:从识别到操控操作说明1.引言 在《塞尔达传说》中,林…

基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战

目录 前言 一、百度POI分类简介 1、数据表格 2、分类结构 二、从Excel导入到PG数据库 1、Excel解析流程 2、数据入库 3、入库成果及检索 三、总结 前言 在上一篇博文中&#xff0c;我们对高德POI分类进行了深入剖析 并对Excel 中 POI 分类数据的存储结构特点进行了详细介…

学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测

YOLO算法更新速度很快&#xff0c;已经出到V13版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型凭借其卓越的精度和计算效率&#xff0c;在实时目标检测领域占据主导地位。然而&#xff0c;YOLOv11 及早期版本的卷积架构&…

Handling outliers in non-blind image deconvolution论文阅读

Handling outliers in non-blind image deconvolution 1. 研究目标与实际意义2. 创新方法:基于EM的异常值建模2.1 新模糊模型2.1.1 目标函数2.2 EM框架:迭代优化二元掩码2.2.1 E步:计算后验权重 E [ m x ] E[m_x] E[mx​]2.2.2 M步:加权正则化反卷积2.3 优化加速技术2.3.1…

Redis 功能扩展:Lua 脚本对 Redis 的扩展

Redis 是一个高性能的内存数据库&#xff0c;支持多种数据结构&#xff0c;如字符串、哈希、列表、集合和有序集合。为了增强其功能&#xff0c;Redis 引入了 Lua 脚本支持&#xff0c;使开发者可以编写自定义的脚本&#xff0c;确保操作的原子性并提高复杂操作的性能。本文将详…

七天学完十大机器学习经典算法-06.支持向量机(SVM):分类边界的艺术——深入浅出指南

接上一篇《七天学完十大机器学习经典算法-05.从投票到分类&#xff1a;K近邻(KNN)算法完全指南》 想象你要在操场上为两个班级划活动区域&#xff0c;如何画出一条最公平的分界线&#xff1f;这条线不仅要分开两班学生&#xff0c;还要让两个班都离分界线尽可能远——这就是支持…

python如何安装PyQt6-stubs依赖包

PyQt6-stubs 是为 PyQt6 提供类型提示&#xff08;Type Hints&#xff09;和 IDE 智能补全支持的第三方补丁包&#xff0c;特别适用于 PyCharm、VS Code 等现代 IDE。它对开发者在编码时帮助极大。 一、安装方法 需要提前安装好git&#xff0c;然后克隆PyQt6-stubs源码&#xf…

创宇智脑 MCP 赋能 AiPy,IP 风险调查效率实现 10 倍飞跃,威胁分析一键生成

还记得上个月那个焦头烂额的凌晨三点吗&#xff1f;监控大屏突然疯狂闪烁&#xff0c;500 多个 IP 地址同时出现异常访问&#xff0c;密密麻麻的数据流在屏幕上跳动&#xff0c;像极了一张让人窒息的大网。我和团队成员瞪着布满血丝的眼睛&#xff0c;手动排查每一个 IP&#x…

使用SRS+ffmpeg实现https推流flv

1修改SRS的live.conf配置如下&#xff1a; # Live streaming config for SRS. # see full.conf for detail config.listen 1935; max_connections 1000; srs_log_tank console; daemon off;http_api {enabled on;listen …

力扣网编程题:合并两个有序数组(双指针解法)

一. 简介 上一篇文章对"合并两个有序数组"题目&#xff0c;使用了暴力解法&#xff0c;算法时间复杂度比较高。文章如下&#xff1a; 力扣网编程题&#xff1a;合并两个有序数组&#xff08;直接解法&#xff09;-CSDN博客 本文满足进阶要求&#xff0c;算法时间复…

数据结构之 【树的简介】(树的(相关)概念、二叉树的概念、部分性质、满二叉树、完全二叉树)

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树在实际中的应用 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4应用题 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;由 n&#xff08;n…

Redis-7.4.3-Windows-x64下载安装使用

Redis软件包下载地址链接&#xff1a;https://github.com/redis-windows/redis-windows/releases 检查或者修改配置文件redis.conf&#xff1a; #如果允许外部其他主机访问本机redis&#xff0c;设置成&#xff1a;bind 0.0.0.0 bind 127.0.0.1 protected-mode yes #设置端口…

Educational Codeforces Round 180 (Rated for Div. 2)

AB 略 C 对于axayaz>max(2*az,an)&#xff0c;枚举y z 二分x D 首先&#xff0c;长度为1的边的已经有n-1条&#xff0c;那么构造的图中只能存在一条长度为2的好边。我们先构造出一个图只存在n-1条好边&#xff0c;我们发现对于一个点所有连接它的边要不均指向它要不均背…

CAD文件处理控件Aspose.CAD教程:在 Python 中将 DGN 文件转换为 PDF

概述 将DGN文件转换为PDF对许多行业至关重要&#xff0c;包括工程和建筑行业。能够轻松地以 PDF 格式共享设计&#xff0c;增强协作和可访问性。通过使用Aspose.CAD for Python via .NET的强大功能&#xff0c;开发人员可以高效地自动化此过程。这款 CAD 转换器 SDK 简化了转换…

宁德时代携手问界,以“厂中厂”模式加速扩产

6月30日&#xff0c;宁德时代在赛力斯超级工厂的两条CTP2.0高端电池包产线正式投产。这是宁德时代在重庆布局的首个基地&#xff0c;并首次采用“厂中厂”合作模式&#xff0c;为问界系列车型本地化生产供应动力电池系统。重庆市、四川省广安市有关负责人&#xff0c;赛力斯集团…