Rust-07-结构体

结构体

和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。可以当作是java对象。使用struct关键字定义

定义结构体

struct User {flag: bool,username: String,email: String,id: u32
}// 使用没有命名字段的元组结构体来创建不同的类型,称为元组结构体
struct Color(i32, i32, i32);// 类单元结构体
// 类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。
struct AlwaysEqual;
fn main() {let subject = AlwaysEqual;
}

一旦定义了结构体后,为了使用它,通过为每个字段指定具体值来创建这个结构体的 实例。

实例化

let mut user = User {flag: true,username: String::from("tom"),email: String::from("hello@email.com"),id : 1
};
// 使用.进行访问
user.flag = false;
//结构体更新语法,使用..复用
let user2 = User {username: String::from("jerry"),..user
};//使用没有命名字段的元组结构体来创建不同的类型,称为元组结构体
struct Color(i32, i32, i32);
let black = Color(0, 0, 0);// 没有任何字段的类单元结构体

示例程序

struct Rectangle {width: u32,height: u32,
}fn main() {let rect1 = Rectangle {width: 30,height: 50,};println!("The area of the rectangle is {} square pixels.",area(&rect1));
}
fn area(rectangle: &Rectangle) -> u32 {rectangle.width * rectangle.height
}

方法

方法与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同
时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义,并且它们第一个参数总是 self ,它代表调用该方法的结构体实例

#[derive(Debug)]
struct Rectangle {width: u32,height: u32,
}
impl Rectangle {
//这里选择 &self 的理由跟在函数版本中使用 &Rectangle 是相同的:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。类似于使用指针fn area(&self) -> u32 {self.width * self.height}
}
fn main() {let rect1 = Rectangle {width: 30,height: 50,};println!("The area of the rectangle is {} square pixels.",rect1.area());
}

使用方法替代函数,除了可使用方法语法和不需要在每个函数签名中重复 self 的类型之外,其主要好处在于组织性。我们将某个类型实例能做的所有事情都一起放入 impl 块中,而不是让将来的用户在我们的库中到处寻找 Rectangle 的功能。
在 C/C++ 语言中,有两个不同的运算符来调用方法:. 直接在对象上调用方法,而 -> 在一个对象的指针上调用方法,这时需要先解引用指针。换句话说,如果 object 是一个指针,那么 object->something() 就像(*object).something() 一样。
Rust 并没有一个与 -> 等效的运算符;相反,Rust 有一个叫 自动引用和解引用的功能。方法调用是 Rust 中少数几个拥有这种行为的地方。它是这样工作的:当使用 object.something() 调用方法时,Rust 会自动object 添加 & 、&mut 或 * 以便使 object 与方法签名匹配。这种自动引用的行为之所以有效,是因为方法有一个明确的接收者———— self 的类型。在给出接收者和方法名的前提下,Rust 可以明确地计算出方法是仅仅读取(&self ),做出修改(&mut self )或者是获取所有权(self )

关联函数

所有在 impl 块中定义的函数被称为 关联函数(associated functions),因为它们与 impl 后面命名的类型相关。我们可以定义不以 self 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数:在 String 类型上定义
的 String::from 函数

struct Rectangle {width:u32,height:u32
}impl Rectangle {fn square(size: u32) -> Self {Self {width: size,height: size,}}
}fn main() {let sq = Rectangle::square(10);
}

关键字 Self 在函数的返回类型中代指在 impl 关键字后出现的类型,在这里是 Rectangle,每个结构体也允许有多个impl块

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

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

相关文章

Macbook M芯片JDK的安装

Macbook M芯片JDK的安装 下载 搜索zulu; 进入这个网址 https://www.azul.com/downloads/#zulu 进入页面后向下滑动 选择对应选项 然后点击Download进行下载。 选择.dmg格式的安装包,点击。 安装 下载完成后,到下载目录,双击…

窗帘怎么选好看不踩坑

雅静说窗帘好看不踩坑,五点全搞定      买窗帘时,别一开口就问多少钱,啥材质,环保不      会显得很小白,容易被坑,      1,大部分窗帘都是涤纶的, 只不过做出来的质感不一样      如果是原木风可以选棉麻质感的,奶油风和现代简约      可以选雪尼尔质感的,…

MSPM0l1306——配置滴答定时器

我们配置好了滴答定时器之后,还要手动编写滴答定时器的中断服务函数,因为我们开启的滴答定时器的中断,当滴答定时器的计数值从我们设置的值减到0时,就会触发一次中断,触发中断就会执行中断服务函数。各个中断的中断服务…

Flutter 中的 DropdownButtonHideUnderline 小部件:全面指南

Flutter 中的 DropdownButtonHideUnderline 小部件:全面指南 Flutter 是一个流行的开源移动 UI 框架,由 Google 开发,允许开发者使用单一的代码库构建高质量的 iOS 和 Android 应用。Flutter 提供了丰富的组件,其中 DropdownButt…

【Spring Boot】异常处理

异常处理 1.认识异常处理1.1 异常处理的必要性1.2 异常的分类1.3 如何处理异常1.3.1 捕获异常1.3.2 抛出异常1.3.4 自定义异常 1.4 Spring Boot 默认的异常处理 2.使用控制器通知3.自定义错误处理控制器3.1 自定义一个错误的处理控制器3.2 自定义业务异常类3.2.1 自定义异常类3…

树莓派 5 AI 套件(Hailo-8L)使用教程

系列文章目录 前言 The Raspberry Pi AI Kit Raspberry Pi AI 套件将 Raspberry Pi M.2 HAT 与 Hailo AI 加速模块捆绑在一起,供 Raspberry Pi 5 使用。套件包含以下内容: 包含神经处理单元(NPU)的 Hailo AI 模块Raspberry Pi M.…

STM32 proteus + STM32Cubemx仿真教程(第二课按键教程)

文章目录 前言一、STM32按键的原理二、STM32Cubemx创建工程三、proteus仿真电路图四、程序代码编写4.1函数介绍4.2使用按键点亮LED灯 总结 前言 本篇文章开始带大家学习如何使用proteus和STM32Cubemx来完成STM32的学习,第二节课我们先来学习按键的用法。 proteus使…

[docker] docker-compose-mysql.yml

引言:作为一名专业的资深开发,本地一定拥有了不少开源项目以供学习,每次都要去启动 mysql 数据库跟 redis 服务器,这种操作1.挺烦的,挺费时间,每次都要启动命令来一次;2.占用自己电脑的资源&…

五款软件推荐:U盘数据不小心删除了?帮你快速找回!

U盘数据不小心删除了怎么恢复?U盘是一种便携式存储设备,因其小巧轻便而广受欢迎。但是,U盘也常常会遇到数据丢失的问题。当U盘数据丢失时,需要找到一款可靠的数据恢复软件来恢复数据。 接下来为大家推荐5款好用的免费U盘数据恢复软…

Python 使用scrapy框架

1、安装scrapy 2、使用scrapy创建项目,在终端命令行 执行如下命令,会创建一个myproject项目 scrapy startproject myproject 3、创建完成后,目录结构如下 4、cd myproject进入项目 ,执行scrapy genspider weather ******,会在spiders下创建…

Incredibuild for Mac 来了!

Mac 开发者在寻找适合自己需求的工具时可能会遇到一些困难,因为 Mac 操作系统相对封闭,不像其他系统那样开放和灵活。尽管如此,Mac 开发者在开发应用程序时的需求(比如功能、效率等)和使用其他操作系统的开发者是类似的…

Linux中安装Docker,并使用Docker安装MySQL和Redis

1、安装docker 1卸载系统之前的docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装Docker-CE #安装必须的依赖 sudo yum install -y yum-utils \device-map…

LINUX----进程替换,exec族函数

execl族函数的作用 exel族函数用于调用一个已经存在的可执行程序,将该程序的运行需要的代码区和数据区的数据覆盖原进程,这样就可以实现在一个进程中调度另一个进程. 简单实现一个小功能来看一看 mytest.c #include <stdio.h> #include <unistd.h>int main(){print…

开源VS闭源

当我们谈论大模型时&#xff0c;往往会涉及到开源和闭源两种不同的模型类型&#xff0c;开源和闭源的主要区别在于源代码的访问权限和修改能力。开源意味着软件的源代码对公众开放&#xff0c;任何人都可以查看、修改和分发源代码&#xff0c;这促进了技术的透明性、合作和创新…

抽象的java入门1.3.0

前言&#xff1a; 在1.2.0版本中我们介绍了public class hello {}并从中提取出两个新概 修饰符和作用域 public class hello {public static void main(String[] args) {System.out.println("Hello World");} } 正片&#xff1a; 这一期把剩余的内容刨析出来 pub…

【Redis学习笔记04】Jedis客户端(上)

Java客户端操作Redis Java生态丰富&#xff0c;自定义的客户端非常多&#xff0c;常见的有Jedis、Lettuce、以及Spring整合后的RedisTemplate&#xff0c;但是对于初学者而言&#xff0c;从Jedis开始入门学习是非常容易上手的&#xff0c;因为Jedis中的API与原生Redis命令高度…

Android Bugreport分析工具:ChkBugReport教程

安装&#xff1a; 如果下载地址过期请看原仓库地址的wiki&#xff0c;或许会有更新&#xff1a;https://github.com/sonyxperiadev/ChkBugReport/wiki 提前下载好如下文件&#xff1a; ​​​​​​http://sonyxperiadev.github.io/ChkBugReport/download/chkbugreport (Lau…

Python中的上下文管理器(contextlib)模块

Python中的contextlib模块提供了一些用于创建和管理上下文管理器&#xff08;context managers&#xff09;的工具。上下文管理器是实现了__enter__()和__exit__()方法的对象&#xff0c;它们通常用于确保在代码块执行前后执行某些操作&#xff0c;比如资源获取与释放、设置和重…

一分钟有60秒,这个有趣的原因你知道吗?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

string类的模拟实现的一些改进

上回我们完成了string类的模拟实现&#xff0c;不过之前写的传统写法本篇&#xff0c;我们将要对其进行一些改进&#xff0c;写成参考的是现代写法&#xff0c;这样写可以提高可读性。 上回我们写好的string类 //string.h #pragma once#define _CRT_SECURE_NO_WARNINGS 1 #p…