6.结构体

目录

  • 一、普通结构体(struct)
    • 1.1 说明
    • 1.2 举例
      • 1)结构体定义及访问
      • 2)结构体初化的简单写法
      • 3)结构体更新语法
  • 二、元组结构体(tuple struct)
    • 2.1 概念
    • 2.2 示例
  • 三、类单元结构体(unit-like structs)
    • 3.1 概念
    • 3.2 举例
  • 四、类的使用示例
  • 五、为结构体添加实现方法
    • 5.1 概念
    • 5.2 举例
  • 六、关联函数
    • 6.1 概念
    • 6.2 示例

一、普通结构体(struct)

1.1 说明

  • 需要为所有字段定义名称及类型
  • 结构体可以作为函数的返回值
  • 一旦struct的实例是可变的,那么实例中所有字段都是可变的
  • 实例化时,结构体字段的顺序不需要和它们在声明的的顺序一致

1.2 举例

1)结构体定义及访问

//定义结构体
struct User {username: String,email: String,sing_in_count: u64,active: bool,
}//得到一个结构体实例(未按照定义时的顺序)
fn get_new_user() -> User {User {email: String::from("ch@163.com"),sing_in_count: 86,username: String::from("ch@163.com"),active: false,}
}fn main() {//定义一个可变的结构体实例let mut user1 = User {email: String::from("xxx@163.com"),username: String::from("xxx"),active: true,sing_in_count: 556,};let user2 = get_new_user();println!("user1: email = {}", user1.email); //xxx@163.comuser1.email = String::from("yyy@189.com");  //修改可变的值println!("user1: email  = {}", user1.email);  //yyy@189.comprintln!("user2: email  = {}", user2.email);  //ch@163.com
}

2)结构体初化的简单写法

  • 前面得到实例时都要重复写字段名称和变量,过于繁琐;
  • 当字段名与字段值对应变量名相同时,就可以使用字段初始化简写的方式;
fn get_new_user(email: String, username: String) -> User {User {email,sing_in_count: 86,username,active: false,}
}

3)结构体更新语法

  • 通过改变旧实例中少部分值来创建一个新的结构体实例可以使用结构体更新语法
  • .. 旧实例语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值;
    *..旧实例必须放在最后,以指定其余的字段应从旧实例的相应字段中获取其值,但我们可以选择以任何顺序为任意字段指定值,而不用考虑结构体定义中字段的顺序;
  • ..旧实例后不能加逗号;
  • 要注意所有权转移的问题
struct User {username: String,email: String,sing_in_count: u64,active: bool,
}fn get_new_user() -> User {let username = String::from("ch@163.com");let email = String::from("ch@163.com");User {username,email,sing_in_count: 86,active: false,}
}fn main() {let user1 = get_new_user();//未采用更新语法let user2 = User{username: String::from("user2"),email: String::from("user2@163.com"),sing_in_count: user1.sing_in_count,active: user1.active,};//采用结构体更新语法let user3 = User{username: String::from("user3"),..user1  //不能写逗号,其它的用user1的赋值};// println!("user1.username = {}", user1.email); //所有权已经转移到user3,所以这里不能使用println!("user2.username = {}, sing_in_count = {}", user2.username, user2.sing_in_count);println!("user3.username = {}, sing_in_count = {}", user3.username, user3.sing_in_count);
}

二、元组结构体(tuple struct)

2.1 概念

  • 定义与元组类似的结构体,称为元组结构体
  • 元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型
  • 当想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,可以使用元组结构体;
  • 要定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型;

2.2 示例

fn main() {struct Color(i32, i32, i32);struct Point(i32, i32, i32);let black = Color(3, 4, 5);let origin = Point(33, 15, 14);println!("{} {} {}", black.0, black.1, black.2);println!("{} {} {}", origin.0, origin.1, origin.2);
}

三、类单元结构体(unit-like structs)

3.1 概念

  • 类单元结构体是一个没有任何字段的结构体
  • 类似于 (),即单元类型(只有一个值,被称为单元值);
  • 类单元结构体常常在想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用;

3.2 举例

struct AlwaysEqual;fn main() {let subject = AlwaysEqual;
}
  • 使用struct关键字定义 AlwaysEqual,以分号结尾;
  • 在main函数中,以代码所示的方法获得 AlwaysEqual 的实例变量 subject;
  • 下一步将实现这个类型的行为,即每个实例始终等于每一个其他类型的实例,也许是为了获得一个已知的结果以便进行测试。现在不需要任何数据来实现这种行为。在以后的文章里将会看到如何定义特性并在任何类型上实现它们,包括类单元结构体。

四、类的使用示例

#[derive(Debug)]
struct Rectangle{width: u32,height: u32,
}//只传递引用,因此不会获取传入变量的所有权
fn area(rect: &Rectangle) -> u32 {rect.width * rect.height
}fn main() {let rc = Rectangle{width: 53,height: 20,};println!("area = {}", area(&rc));println!("rc = {:#?}", rc)
}
  • 代码计算长方体的面积;
  • area传入的是引用,因此不会获得变量的所有权;
  • #[derive(Debug)]与println的{:#?}配合使用是为了查看实体化后rc的值,如果把前者取消并且使用println!("rc={}",rc)打印结果,会得到如下错误
    在这里插入图片描述
    按照说明修改println!的参数再编译会得到如下错误
    在这里插入图片描述
    因此,根据提示一步步修改就会得到正确的结果

五、为结构体添加实现方法

5.1 概念

  • 使用fn关键字和名称声明,可以拥有参数和返回值;
  • 方法在结构体的上下文中被定义(或者是枚举或 trait 对象的上下文),并且第一个参数总是 self,代表调用该方法的结构体实例;
  • 一般将方法的第一个参数写为&self,只希望能够读取结构体中的数据,而不是写入;
  • 想要在方法中改变调用方法的实例,需要将第一个参数改为&mut self
  • 通过仅仅使用 self 作为第一个参数来使方法获取实例的所有权是很少用的;该功能通常用在当方法将 self 转换成别的实例的时候,想要防止调用者在转换之后使用原始的实例。

5.2 举例

  • area方法实现了面积的计算;
  • can_hold方法计算当前对象是否能够包围住第二个Rectangle对象的实例;
#[derive(Debug)]
struct Rectangle{width: u32,height: u32,
}impl Rectangle{fn area(&self) -> u32{self.width * self.height}fn can_hold(&self, src: &Rectangle) -> bool{self.width >= src.width && self.height >= src.height}
}fn main() {let rc = Rectangle{width: 53,height: 20,};let rc2 = Rectangle{width: 51,height: 20,};println!("{}", rc.can_held(&rc2));
}

六、关联函数

6.1 概念

  • 所有在 impl 块中定义的函数被称为关联函数;
  • 可以定义不以 self为第一参数的关联函数(类似于类的静态函数),String::from就是一个关联函数;

6.2 示例

使用关联函数创建正文形并计算面积。

#[derive(Debug)]
struct Rectangle{width: u32,height: u32,
}impl Rectangle{fn area(&self) -> u32{self.width * self.height}fn square(size: u32) -> Rectangle{Rectangle{width: size,height: size,}}
}fn main() {let rc = Rectangle::square(3);println!("rc.area = {}", rc.area());
}

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

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

相关文章

安全智能预警软件有人试图窃取会立即发出高分贝警报已解锁VIP功能

一款手机安全智能预警软件,无论是网吧还是餐馆小聚,您的手机都能得到贴心的守护,一旦有人试图窃取,应用会立即发出高分贝警报,确保您在公交、地铁、商场等拥挤环境中依然能牢牢掌控手机。(解锁专业版&#…

【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】

调试笔记-系列文章目录 调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 文章目录 调试笔记-系列文章目录调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 前言一、调试环境操作系统:Windows 10 专业版调试环境调试目标 二、调…

Go使用https

一、服务端 1. 生成私钥和证书 安装OpenSSL windows安装OpenSSL生成CA证书创建证书 以上两个步骤,参考:Go http2 和 h2c 2. 代码 package mainimport ("log""net/http""time""golang.org/x/net/http2" )co…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

Qt | openSSL将TCP数据进行不对称(RSA)加密传输-windows平台实操(可行)

01、windows平台工具准备 QtQt5.14.2openSSL下载(选择适合自己的版本即可)https://slproweb.com/products/Win32OpenSSL.htmlTCP调试助手调试助手02、简介 首先简单介绍一下openssl。接着描述如何在windo

D435相机结合Yolo V8识别出目标物体,并转点云出抓取位姿。

最近项目上需要完成整个识别、定位、到最后的抓取流程。 分享一下,通过使用D435相机并结合Yolo V8识别出目标物体后,抠取出目标物体部分的有效深度图,最后将前景物体部分的RGB D435相机结合Yolo V8识别出目标物体,并转点云出抓取位…

问题:设开环系统的频率特性为则其相频特性穿越-180°线时对应的频率为()。 #学习方法#微信

问题:设开环系统的频率特性为则其相频特性穿越-180线时对应的频率为()。 ? A、10rad1s B、3rad/s C、lradIs D、√3rad/s 参考答案如图所示

python使用wkhtmltopdf将html字符串保存pdf,解决出现方框的问题

出现的问题&#xff1a; 解决办法&#xff1a; <html> <head><meta charset"UTF-8"/> </head> <style> * {font-family: Arial,SimSun !important; } </style> </html>在html字符串前面加上上面代码&#xff0c;意思是设…

结构体<C语言>

导言 结构体是C语言中的一种自定义类型&#xff0c;它的值&#xff08;成员变量&#xff09;可以是多个&#xff0c;且这些值可以为不同类型&#xff0c;这也是和数组的主要区别&#xff0c;下面将介绍它的一些基本用法&#xff0c;包括&#xff1a;结构体的创建、结构体变量的…

Pyramid Vision Transformer, PVT(ICCV 2021)原理与代码解读

paper&#xff1a;Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions official implementation&#xff1a;GitHub - whai362/PVT: Official implementation of PVT series 存在的问题 现有的 Vision Transformer (ViT) 主要设计…

一款优秀的下载和共享工具

一、简介 1、它以舒适和快速的方式下载Internet文件&#xff0c;同时支持断点续传和嗅探视频音频的功能。 它具有站点抓取、批量下载队列和计划任务下载等功能&#xff0c;可以接管所有浏览器的下载任务&#xff0c;包括Edge&#xff0c;Firefox和Chrome等主流浏览器。 对于用…

Django DeleteView视图

Django 的 DeleteView 是一个基于类的视图&#xff0c;用于处理对象的删除操作。 1&#xff0c;添加视图函数 Test/app3/views.py from django.shortcuts import render# Create your views here. from .models import Bookfrom django.views.generic import ListView class B…

Windows电脑清理C盘内存空间

ps&#xff1a;过程截图放在篇末 一、%tmp%文件 win R键呼出运行窗口&#xff0c;输入 %tmp% 自动进入tmp文件夹&#xff0c;ctrl A全选删除 遇到权限不足&#xff0c;正在运行&#xff0c;丢失的文件直接跳过即可 二、AppData文件夹 1、pipcache 在下列路径下面&…

Python爬取城市空气质量数据

Python爬取城市空气质量数据 一、思路分析1、寻找数据接口2、发送请求3、解析数据4、保存数据二、完整代码一、思路分析 目标数据所在的网站是天气后报网站,网址为:www.tianqihoubao.com,需要采集武汉市近十年每天的空气质量数据。先看一下爬取后的数据情况: 1、寻找数据…

Spark学习——不同模式下执行脚本

举个简单的例子&#xff1a;使用spark官方用例"取pi值" 一、local模式 进入spark目录执行后台命令&#xff1a; bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master local[*] \ ./examples/jars/spark-examples_2.12-3.2.1.jar \ 10运行结…

【华为 ICT HCIA eNSP 习题汇总】——题目集21

1、OSPF协议中的hello报文不包括以下哪个字段&#xff1f; A、Priority&#xff08;优先级&#xff09; B、Neighbor&#xff08;邻居表&#xff09; C、Interval&#xff08;时间间隔&#xff09; D、Checksum&#xff08;校验和&#xff09; 考点&#xff1a;路由技术原理 解…

视频行人搜索 (Person Search in Videos)

文章目录 视频行人搜索 (Person Search in Videos)图像行人搜索存在问题Video PS 定义MTA-PS数据集First person search dataset in videosComplicated ambient conditions and realistic monitoring scenariosPrivacy insensitivity 方法 视频行人搜索 (Person Search in Vide…

GIS之arcgis系列10:arcpy实现批量掩膜提取

按掩膜提取 (Spatial Analyst) 提取掩膜所定义区域内的相应栅格像元。 OutRas ExtractByMask(InRas1, InMsk1, "INSIDE") 使用情况 输入栅格中的其他属性&#xff08;若有的话&#xff09;将按照原样添加到输出栅格属性表。 根据所记录的属性&#xff0c;某些属性…

查看服务器的硬件信息、操作系统等常用命令

在Linux下查看服务器是什么类型的服务器&#xff0c;通常可以通过查看服务器的硬件信息、操作系统和已安装的服务来判断。以下是一些常用的命令&#xff1a; 查看操作系统信息&#xff1a; cat /etc/*release* 查看CPU信息&#xff1a; lscpu 查看内存信息&#xff1a; free…

分布式光纤测温DTS与红外热成像系统的主要区别是什么?

分布式光纤测温DTS和红外热成像系统在应用领域和工作原理上存在显著的区别&#xff0c;两者具有明显的差异性。红外热成像系统适用于表现扩散式发热、面式场景以及环境条件较好的情况下。它主要用于检测物体表面的温度&#xff0c;并且受到镜头遮挡或灰尘等因素的影响会导致失效…