Rust---复合数据类型之结构体

目录

  • 结构体的使用
    • 输出结果
  • 结构体简化创建
  • 结构体更新语法
  • 元组结构体
  • 单元结构体(unit struct)
  • 结构体中的引用
  • 使用#[derive(Debug)]
    • 再次介绍
  • 代码综合展示

与元组不同的是,结构体可以为内部的每个字段起一个富有含义的名称,因此无需依赖这些字段的顺序就可以来访问和解析它们。

结构体的使用

// 定义一个结构体 Person
struct Person {name: String,age: u32,
}// 为 Person 结构体实现方法
impl Person {fn greet(&self) {println!("Hello, my name is {}.", self.name);}
}fn main() {// 创建一个 Person 结构体实例let mut person1 = Person {name: String::from("Alice"),age: 30,};// 修改 Person 结构体字段// 必须要将结构体实例声明为可变的,才能修改其中的字段,Rust 不支持将某个结构体某个字段标记为可变。person1.name = String::from("Amy");// 访问 Person 结构体字段println!("Name: {}", person1.name);println!("Age: {}", person1.age);// 调用 Person 结构体方法person1.greet();
}

输出结果

在这里插入图片描述

结构体简化创建

fn build_user(email: String, username: String) -> User {User {email,//当函数参数和结构体字段同名时,可以直接使用缩略的方式进行初始化username,//当函数参数和结构体字段同名时,可以直接使用缩略的方式进行初始化active: true,sign_in_count: 1,}
}

结构体更新语法

  • .. 语法表明凡是我们没有显式声明的字段,全部从 user1 中自动获取。
  • 需要注意的是 ..user1 必须在结构体的尾部使用。
  let user2 = User {email: String::from("another@example.com"),..user1};
  • 结构体更新语法跟赋值语句 = 非常相像,结果是,username 所有权被转移给了 user2,导致了 user1 无法再被使用。
  • 把结构体中具有所有权的字段转移出去后,将无法再访问该字段,但是可以正常访问其它的字段。

元组结构体

  • 元组结构体在某些情况下比普通结构体更方便,特别是当您只需要一个简单的数据结构来存储几个字段时。元组结构体可以帮助您更清晰地表达代码的意图,并且具有元组的轻量性和灵活性。
  • 结构体的字段可以没有名称,这种结构体长得很像元组。
// 定义一个类似元组的结构体 Color,表示颜色
struct Color(i32, i32, i32);// 定义一个类似元组的结构体 Point,表示三维空间中的点
struct Point(i32, i32, i32);fn main() {// 创建一个 Color 结构体实例,表示黑色let black = Color(0, 0, 0);// 创建一个 Point 结构体实例,表示原点let origin = Point(0, 0, 0);// 访问 Color 结构体的字段println!("Black: ({}, {}, {})", black.0, black.1, black.2);// 访问 Point 结构体的字段println!("Origin: ({}, {}, {})", origin.0, origin.1, origin.2);
}

单元结构体(unit struct)

  • 它不包含任何字段。单元结构体的定义非常简单,只是由结构体关键字 struct 后面跟结构体的名称构成,例如:
struct UnitStruct;
  • 单元结构体在 Rust 中主要用于表示不需要存储数据的类型,通常用作占位符、类型标记或模块化设计中的辅助类型。

结构体中的引用

  • 如果想在结构体中使用一个引用,就必须加上生命周期。
  • 生命周期能确保结构体的作用范围要比它所借用的数据的作用范围要小。

使用#[derive(Debug)]

  • 如果使用 {} 来格式化输出,那对应的类型就必须实现 Display 特征,结构体不默认实现 Display 特征。因此下面的代码会报错:
struct Rectangle {width: u32,height: u32,
}fn main() {let rect1 = Rectangle {width: 30,height: 50,};println!("rect1 is {}", rect1);
}
  • 如果改为:println!("rect1 is {:?}", rect1);
// 会提醒我们没有实现debug特征
error[E0277]: `Rectangle` doesn't implement `Debug`
  • 正确使用方法:
#[derive(Debug)]// 加上这一个东西
struct Rectangle {width: u32,height: u32,
}fn main() {let rect1 = Rectangle {width: 30,height: 50,};println!("rect1 is {:?}", rect1);
}

再次介绍

  • Rust 中,#[derive(Debug)] 是一个非常方便的属性,用于自动实现 Debug traitDebug trait 是一个用于打印调试信息的 trait,通过实现这个 trait,可以使用 println!("{:?}", variable); 这样的方式来输出变量的调试信息,而不需要手动实现 Debug traitfmt 方法。
  • #[derive(Debug)] 的使用可以简化代码,并让我们更方便地输出结构体、枚举等类型的调试信息。

代码综合展示

// 定义一个结构体 Person
struct Person {name: String,age: u32,
}// 为 Person 结构体实现方法
impl Person {fn greet(&self) {println!("Hello, my name is {}.", self.name);}
}// 定义一个元组结构体 Point
struct Point(i32, i32);// 定义一个结构体 Rectangle,并衍生 Debug 特性
#[derive(Debug)]
struct Rectangle {width: u32,height: u32,
}fn main() {// 创建一个 Person 结构体实例let person1 = Person {name: String::from("Alice"),age: 30,};// 访问 Person 结构体字段println!("Name: {}", person1.name);println!("Age: {}", person1.age);// 调用 Person 结构体方法person1.greet();// 创建一个可变 Person 结构体实例let mut person2 = Person {name: String::from("Bob"),age: 25,};// 修改 Person 结构体字段person2.age = 26;// 创建一个元组结构体实例let origin = Point(0, 0);// 创建一个 Rectangle 结构体实例let rect = Rectangle {width: 10,height: 20,};// 打印 Rectangle 结构体实例,使用 Debug 特性println!("{:?}", rect);
}

输出结果:【这个警告实在是不知道怎么修改,明明已经使用println!("{:?}", variable);了】
在这里插入图片描述

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

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

相关文章

【THM】Burp Suite:Other Modules(其他模块)-初级渗透测试

介绍 除了广泛认可的Repeater和Intruder房间之外,Burp Suite 还包含几个鲜为人知的模块。这些将成为这个房间探索的重点。 重点将放在解码器、比较器、排序器和组织器工具上。它们促进了编码文本的操作,支持数据集的比较,允许分析捕获的令牌内的随机性,并帮助您存储和注释…

吴恩达机器学习笔记:第 6 周-11机器学习系统的设计(Machine Learning System Design)11.1-11.5

目录 第 6 周 11、 机器学习系统的设计(Machine Learning System Design)11.1 首先要做什么11.2 误差分析11.3 类偏斜的误差度量11.4 查准率和查全率之间的权衡11.5 机器学习的数据 第 6 周 11、 机器学习系统的设计(Machine Learning System Design) 11.1 首先要做什么 在接…

复杂度的讲解

1.算法效率 如何衡量一个算法的好坏?从两个维度,时间和空间(算法运行的快慢,消耗的空间大不大)。因为计算机硬件领域的高速发展,如今计算机的存储量已经达到了一个很高的程度,所以现在我们一般…

Linux--进程(2)

目录 前言 1. 进程的状态 1.1 进程排队 1.2 运行,阻塞,挂起 2.Linux下具体的进程状态 2.1僵尸和孤儿 3.进程的优先级 4.Linux的调度与切换 前言 这篇继续来学习进程的其它知识 上篇文章:Linux--进程(1)-CS…

51单片机入门_江协科技_21.2_74HC595 在Proteus中模拟8x8点阵屏环境搭建

1. 为了在proteus中模拟学习江协科技51单片机教程,需要在proteus中搭建74HC595驱动8x8点阵屏的仿真环境; 1.1. 因为连接单片机P0口作为点阵屏负极(行选),所以需要先在P0口上接上上拉电阻RESPACK 8,1k欧姆阻…

闻风丧胆的算法(二)

🌈个人主页:Rookie Maker 🔥 系列专栏:算法 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆 😀欢迎来到我的代码世界~ 😁 喜欢的小…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】___续

Vue3中监听多条数据的两种使用 1.watch【使用上一章写法,监听两个属性,然后执行相应操作…】 2.watchEffect【相对于使用watch,watchEffect默认页面初始加载,有点类似加配置:立即执行 immediate】 代码: …

MySql 实战大数据查询-(表分区实现)

一 mysql分区: 分区是将单个表按照某种规则划分成多个子集,每个子集称为一个分区。常见的分区策略包括按照时间范围、范围值、列表等进行分区。 优点: 查询性能更好,涉及分区键的查询,数据库引擎可以只扫描特定分区&…

Cesium 批量种树

1、准备树种建模 分各种级别建模LOD1-LODN 其中meta.json长这样: Gltf再3Dmax中导出Obj,再通过ObjToGltf的工具转换,参考 https://editor.csdn.net/md/?articleId96484597 2、准备shp点数据。(shp中的点位就是种树的位置) 3、准…

神经网络汇聚层

文章目录 最大汇聚层平均汇聚层自适应平均池化层 最大汇聚层 汇聚窗口从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚…

清明作业 c++

1.封装一个类&#xff0c;实现对一个数求累和阶乘质数 #include <iostream>using namespace std; int mproduct(int a){if(a>1){return a*mproduct((a-1));}else{return 1;} } class number{int a; public:number():a(5){};number(int a):a(a){}void set(int a){thi…

启动mysql

删除C:\Program Files (x86)\MySQL\MySQL Server 5.7这个路径下的data文件夹&#xff0c;这个很难删除&#xff0c;因为一开机&#xff0c;mysql的某些服务就启动了&#xff0c;每次重新启动mysql之前&#xff0c;都要删除这个文件夹 因为这个文件夹在后端执行一些我们看不到的…

力扣---删除排序链表中的重复元素 II

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1a; 输入&#xff1a;head [1,1,1,…

计算机中丢失steam_api64.dll怎么办?七个方法教你轻松解决

在计算机使用过程中&#xff0c;我们经常会接触到各种各样的动态链接库&#xff08;DLL&#xff09;文件。其中&#xff0c;steamapi64.dll是Steam游戏平台中的一个关键组件&#xff0c;它为Windows操作系统带来了许多好处。本文将详细介绍steamapi64.dll对Windows的好处以及其…

基于小程序实现的校园二手物品交易系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

9proxy—数据采集工具全面测评

9Proxy数据采集工具Unlock the web with 9Proxy, the top residential proxy provider. Get unlimited bandwidth, affordable prices, and secure HTTPS and Socks5 configurations.https://9proxy.com/?utm_sourceblog&utm_mediumcsdn&utm_campaignyan 前言 在当今数…

笔记本电脑win7 Wireless-AC 7265连不上wifi6

1.背景介绍 旧路由器连接人数有限&#xff0c;老旧&#xff0c;信号不稳定更换了新路由器&#xff0c;如 TL-XDR5430易展版用户电脑连不上新的WIFI网络了&#xff0c;比较着急 核心问题&#xff1a;有效解决笔记本连接wifi上网问题&#xff0c;方法不限 2.环境信息 Windows…

Unity框架,ET框架8.1版本的打包流程记录

目录 打包代码前置1.必须要安装Visusal Studio 2022的组件&#xff0c;如下图&#xff0c;必须都要进行安装&#xff0c;不然会在代码重构的时候报错&#xff0c;丢失SDK。Rider的版本必须2023及以上 步骤一、使用Rider编辑器打开项目后进行重构项目步骤二、使用HybirdCLR生成A…

一文介绍回归和分类的本质区别 !!

文章目录 前言 1、回归和分类的本质 &#xff08;1&#xff09;回归&#xff08;Regression&#xff09;的本质 &#xff08;2&#xff09;分类&#xff08;Classification&#xff09;的本质 2、回归和分类的原理 &#xff08;1&#xff09;回归&#xff08;Regression&#x…

移动端基础

移动端基础 一.了解二.视口1.视口形式2.视口标签3.viewport设置 三.二倍图1.像素比2.多倍图3.背景缩放及使用&#xff08;background-size&#xff09;4.多倍图切图 四.移动端开发选择1.单独制作2.响应式3.总结 五.移动端技术解决方案1.初始化2.盒子模型3.特殊样式 六.常见布局…