Rust学习笔记005:结构体 struct

        在 Rust 中,struct 是一种用于创建自定义数据类型的关键字,它允许你定义和组织数据的结构。struct 可以包含多个不同类型的字段(fields),每个字段都有一个名称和一个类型。

定义结构体

在这里插入图片描述

        下面是一个简单的例子,展示了如何定义和使用 struct

// 定义一个结构体
struct Point {
    x: f64,
    y: f64,
}

// 使用结构体
fn main() {
    // 创建 Point 结构体的实例
    let origin = Point { x: 0.0, y: 0.0 };

    // 访问结构体的字段
    println!("X coordinate: {}", origin.x);
    println!("Y coordinate: {}", origin.y);

    // 创建可变的结构体实例,并修改字段的值
    let mut point = Point { x: 5.0, y: 10.0 };
    point.x = 7.0;

    // 结构体的解构
    let Point { x, y } = point;
    println!("X: {}, Y: {}", x, y);
}

元组结构体(Tuple Structs):

        Rust 还支持一种特殊的结构体,称为元组结构体。它们类似于元组,但有一个具体的命名。

在这里插入图片描述

// 元组结构体
struct Color(u8, u8, u8);

fn main() {
    // 创建 Color 元组结构体的实例
    let red = Color(255, 0, 0);

    // 访问元组结构体的字段
    println!("Red component: {}", red.0);
}

        在这个例子中,Color 是一个元组结构体,有三个字段,分别表示 RGB 颜色的三个分量。通过 (255, 0, 0) 创建了一个红色的实例,并通过 .0 访问了第一个字段。

类单元结构体(Unit-like Structs):

        有时候,一个结构体不包含任何字段,这种结构体被称为类单元结构体。

// 类单元结构体
struct EmptyStruct;

fn main() {
    // 创建类单元结构体的实例
    let empty = EmptyStruct;
    // 无字段可访问
}

        这是一个非常简单的例子,但有时候类单元结构体用于实现某种特定的 trait,或者作为类型标记的一部分。

可变性

如果结构体的某个字段需要被修改,需要将结构体声明为可变的。可变性在 Rust 中是默认不可变的,因此如果要修改结构体的字段,需要使用 mut 关键字。

struct MutableStruct {
    value: i32,
}

impl MutableStruct {
    fn modify_value(&mut self, new_value: i32) {
        self.value = new_value;
    }
}

fn main() {
    let mut my_struct = MutableStruct { value: 42 };
    my_struct.modify_value(10);
    println!("Modified value: {}", my_struct.value);
}

作为函数返回值

在这里插入图片描述

简写初始化

在这里插入图片描述

更新语法

struct Point {
    x: f64,
    y: f64,
}

fn main() {
    let p1 = Point { x: 1.0, y: 2.0 };

    // 使用更新语法创建新的结构体实例
    let p2 = Point { x: 3.0, ..p1 };

    println!("p2.x: {}", p2.x); // 输出: 3.0
    println!("p2.y: {}", p2.y); // 输出: 2.0 (来自于 p1)
}

在这个例子中,Point { x: 3.0, ..p1 } 创建了一个新的 Point 实例 p2,其中 x 被更新为 3.0,而 y 则继承自现有实例 p1

方法

在这里插入图片描述

在这里插入图片描述

  • 注:#[derive(Debug)]通过trait实现“继承”(本质是代码复用)
    在这里插入图片描述
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于JAVA的酒店管理系统设计

摘 要 我们对酒店进行调研,发现部分酒店依托第三方平台,但第三方平台没有办法更好帮助酒店管理,故我们决定帮助酒店开发一套基于 Java 的酒店管理系统。使用基于Java的酒店管理系统可以帮助酒店完成顾客入住信息的管理,酒店物资的…

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

作者:柳下 概述 随着企业规模和数据量的增长,数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂,因此及时捕获和处理这些变化变得至关重要。为了满足这一需求,数据库 CDC(Change Data Capture&#xff…

2022年全球运维大会(GOPS上海站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员,包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系,让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例,也能与国内顶尖的技术专家…

【大数据面试知识点】Spark中的累加器

Spark累加器 累加器用来把Executor端变量信息聚合到Driver端,在driver程序中定义的变量,在Executor端的每个task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回driver端进行merge。 累加器一般是放在行动算子…

解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG

1. 前言 这段时间,在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位,在项目前期,的确为我们节省了不少时间。 但随着项目持续深入,对于CameraView的使用进入深水区,逐…

lambda表达式和包装器

正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 我们在使用库里的排序算法时如果排序的是自定义类型或者库里默认的排序不能满足我们则需求&…

【单片机项目实战】温度控制系统

本项目的主要作用是实现温度调控,通过设定一个预定的温度值,实现实时检测外界温度,当外界温度小于预定值时,电机正转,实现降温效果;当外界温度大于预定值时,电机反转,实现升温效果&a…

网络安全—PKI公钥基础设施

文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证(交换证书)密钥管理 前提知识 散列函数 散列也可以叫哈希函数,MD5、SHA-1、SHA-2、、(不管叫啥,都记得是同一个东西就行&…

分库分表之Mycat应用学习五

5 Mycat 离线扩缩容 当我们规划了数据分片,而数据已经超过了单个节点的存储上线,或者需要下线节 点的时候,就需要对数据重新分片。 5.1 Mycat 自带的工具 5.1.1 准备工作 1、mycat 所在环境安装 mysql 客户端程序。 2、mycat 的 lib 目录…

mac上使用Navicat Premium 在本地和生产环境中保持数据库同步

Navicat Premium 是一款功能强大的数据库管理和开发工具,支持多种数据库系统,如 MySQL、Oracle、SQL Server 等。作为程序员,我深知在开发过程中需要一款方便、高效的数据库管理工具来提升工作效率。而 Navicat Premium 正是这样一款不可多得…

Spring5注解驱动(六)

5. 自动装配 5.1. Autowired&Qualifier&Primary 在原来,我们就是使用Autowired的这个注解来进行自动装配; 现在有一个BookController 类 package com.hutu.controller;import com.hutu.service.BookService; import org.springframework.bea…

2023最新租号平台系统源码支持单独租用或合租使用

这是一款租号平台源码,采用常见的租号模式。目前网络上还很少见到此类类型的源码。 平台的主要功能如下: 支持单独租用或采用合租模式; 采用易支付通用接口进行支付; 添加邀请返利功能,以便站长更好地推广&#xf…

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蚁狮算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蚁狮优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

逻辑卷学习后续----------缩容

一、缩容:缩减大小 ext4可以 , xfs无法缩减,缩减会影响业务 1.解挂载 2.检查文件系统完整性 3.缩减文件系统 4.缩减逻辑卷上下一致 5.再挂载回去 添加磁盘 文件系统只能装ext4 缩减文件系统 resize2fs 挂载失败需要重新安装文件系统…

磁盘阵列(RAID)

1.独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks) 旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵…

[C#]使用ONNXRuntime部署一种用于边缘检测的轻量级密集卷积神经网络LDC

源码地址: github.com/xavysp/LDC LDC: Lightweight Dense CNN for Edge Detection算法介绍: 由于深度学习方法的快速发展,近年来,用于执行图像边缘检测的卷积神经网络(CNN)模型爆炸性地传播。但边缘检测…

Selenium教程04:鼠标+键盘网页的模拟操作

在webdriver 中,鼠标操作都封装在ActionChains类中,使用的时候需要导入这个包。 from selenium.webdriver import ActionChainsActionChains方法列表如下: click(on_elementNone) ——单击鼠标左键click_and_hold(on_elementNone) ——点击…

开始使用MEVN技术栈开发02 MongoDB介绍

开始使用MEVN技术栈开发02 MongoDB介绍 MongoDB介绍 As indicated by the ‘ M ’ in MEVN, we will use MongoDB as the backend database for our app. MongoDB is a NoSQL database. Before we talk about what is a NoSQL database, let ’ s first talk about relationa…

[每周一更]-(第48期):一名成熟Go开发需储备的知识点(问题篇)- 1

问题篇 1、Go语言基础知识 什么是Go语言?它有哪些特点?Go语言的数据类型有哪些?Goroutine是什么?它与线程的区别是什么?介绍一下Go语言的垃圾回收机制。 2、并发和并行 什么是并发和并行?它们之间的区别…