Rust学习总结之数组,元组,结构体用法

news2025/1/18 3:23:20

         学过数据结构的都知道有这么一个公式,程序=数据结构+算法,好的数据结构能大大降低算法设计的复杂度,也能更好的为算法服务。了解一门新的计算机编程语言其数据结构是必须首先要学的,这有利于对该语言的理解和快速上手。本文将对Rust语言中的数组,元组,结构体的用法进行详细的介绍

目录

1,数组

2,元组

3,结构体


1,数组

        用过C语言的相信对数组的概念并不陌生,用过Python的看到Rust的数组形式想必十分的亲切。数组 array,将多个类型相同的元素依次组合在一起,就是一个数组。

        数组的三个原则:

  • 长度固定                        ----数组的长度是固定的,初始化后长度就固定了
  • 元素必须有相同的类型  ----数组的元素必须是一样的类型
  • 依次线性排列                 ----数组的元素在内存中是在一起的

 举例:

fn main() {
    let s = ['f', 'e', 'i','t','z'];
}

        上面就是一个最简单的数组例子,里面包含了5个元素,在vscode中会自动在后面显示元素类型和元素的个数

 

当然你也可也以显示的写出来

fn main() {
    let s:[char;5] = ['f', 'e', 'i','t','z'];
}

访问数组的的某个元素和C语言中一样,通过下标来访问,下标从0开始

fn main() {
    let s:[char;5] = ['f', 'e', 'i','t','z'];
    println!("array s first element is {}",s[0]);
}

 遍历数组常见的有两种方式,一是通过数组下标去遍历,二是通过数组的可迭代属性去遍历

fn main() {
    let s:[char;5] = ['f', 'e', 'i','t','z'];
    //遍历数组s,方法一
    for index in 0..s.len(){
        println!("遍历数组:s[{}]:{}",index,s[index]);
    }
    //遍历数组s,方法二
    for element in s.iter(){
        println!("遍历数组s:{}",element);
    }
}

运行结果:

遍历数组:s[0]:f
遍历数组:s[1]:e
遍历数组:s[2]:i
遍历数组:s[3]:t
遍历数组:s[4]:z
遍历数组s:f
遍历数组s:e
遍历数组s:i
遍历数组s:t
遍历数组s:z

        上面计算数组的长度可以调用数组的len()方法

2,元组

        上面提到数组只能放入相同类型的元素,在Rust中有没有一种结构能放入不同类型的元素呢,元组就能符合这样的要求。元组的概念不是Rust独有的,在Python中也有元组,Rust元组的形式和Python很像。

Rust 语言中元组的定义语法格式如下:

let tuple_name:(data_type1,data_type2,data_type3) = (value1,value2,value3);

定义元组时也可以忽略数据类型

let tuple_name = (value1,value2,value3);

        Rust 中元组的定义很简单,就是使用一对小括号 () 把所有元素放在一起,元素之间使用逗号 , 分隔。但需要注意的是,如果显式指定了元组的数据类型,那么数据类型的个数必须和元组的个数相同

下面我们定义一个元组并打印出该元组

fn main() {
    let eg_tupple = ('f', 30, 174.5);
    println!("my info is {:?}",eg_tupple);
}

运行结果:

my info is ('f', 30, 174.5)

我们可以使用 元组名.索引数字 来访问元组中相应索引位置的元素。索引从 0 开始。 

fn main() {
    let eg_tupple = ('f', 30, 174.5);
    println!("my age is {}",eg_tupple.1);
    println!("my height is {}",eg_tupple.2);
}

运行结果:

my age is 30
my height is 174.5

 

3,结构体

        重头戏来了,数组和元组由于其结构的固定性,注定不能承担太复杂的数据结构设计,结构体以其灵活的结构可以承担复杂的数据结构设计,在C语言中结构体的运用就非常广泛,在Python中虽然没有结构体的概念,但是Python中的字典结构就非常类似于Rust的结构体。下面我们来详细学习一下Rust的结构体

定义一个结构体的语法格式如下

struct Name_of_structure {
   field1:data_type,
   field2:data_type,
   field3:data_type
}

定义一个结构体时:

  1. 结构体名 Name_of_structure 和元素/字段名 fieldN 遵循普通变量的命名语法。
  2. 结构体中中的每一个元素/字段都必须明确指定数据类型。可以是基本类型,也可以是另一个结构体。

下面我们定义一个结构体,并实例化

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}
fn main() {
    let user1 = User{
        email: String::from("ftzchina@126.com"),
        username: String::from("ftz"),
        active: true,
        sign_in_count: 556,
    };
}

        我们定义了一个结构体User,实例化user1,实例化user1的时候并不需要严格按照结构体定义的变量顺序来初始化,需要注意的是我们初始化的时候必须要全部的成员初始化,不能部分初始化,部分不写

如果要访问结构体实例的某个元素,我们可以使用 元素访问符,也就是 点号 ( . ) 

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}
fn main() {
    let user1 = User{
        email: String::from("ftzchina@126.com"),
        username: String::from("ftz"),
        active: true,
        sign_in_count: 556,
    };
    let my_name = user1.username;
    println!("my name is {}",my_name);
}

         结构体实例默认是 不可修改的,因为结构体实例也是一个使用 let 定义的变量,如果要修改结构体实例,就必须在创建时添加 mut 关键字,让它变成可修改的

当你想基于某个struct实例来创建一个新实例的时候,可以使用struct更新语法

#[derive(Debug)]
struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}
fn main() {
    let user1 = User{
        email: String::from("ftzchina@126.com"),
        username: String::from("ftz"),
        active: true,
        sign_in_count: 556,
    };
    let user2 = User{
        username: String::from("zte"),
        ..user1
    };
    println!("my info is {:#?}",user2);
}


 运行结果:

my info is User {
    username: "zte",
    email: "ftzchina@126.com",
    sign_in_count: 556,
    active: true,
}

 Rust结构体中还有一个tuple struct概念,元组结构体,tuple struct整体有个名,但里面的元素没有名。适用的场景是想给整个tuple起名,并让它不同于其他tuple,而且又不需要给每个元素起名。

#[derive(Debug)]

fn main() {
    struct Color(i32, i32, i32);
    struct Point(i32, i32, i32);
    let black = Color(0,0,0);
    let origin = Point(0,0,0);
}

black和origin是不同的类型,即使他们元组里面的元素一样,它们是不同的tuple struct实例

下面我们用struct写一个相对完整的Rust程序,计算长方形的面积,方便大家更容易理解结构体

#[derive(Debug)]
struct Rectangle{
    width: u32,
    length: u32,
}
fn main() {
    let rect = Rectangle{
        width: 30,
        length: 50,
    };
    println!("the area is {}",area(&rect));
    println!("the rect is {:#?}",rect);
}

//此处用引用&,就是借用rect, 在main中不丧失rect的所有权
fn area(rect: &Rectangle) ->u32{
    rect.width * rect.length
}

 运行结果:

the area is 1500
the rect is Rectangle {
    width: 30,
    length: 50,
}

好了!!!以上就是对Rust数组,元组,结构体学习总结,有不对的地方也欢迎批评指正,点个赞更好,嘻嘻嘻!!!

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

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

相关文章

vue引入cdn Vue 优化Vue引入 cdn vue cdn Vue优化引入CDN vue 项目 CDN优化

vue引入cdn Vue 优化Vue引入 cdn vue cdn Vue优化引入CDN vue 项目 CDN优化未引入 CDN前 main.js更改CDN方式引入在 vue.config 中引入 CDNindex.html 加载 cdn资源使用CDN引入资源后的main.js如果引入CDN后 组件不生效CDN 服务商推荐未引入 CDN前 main.js // 依赖使用 npm 方…

Windows server 2003怎么安装iis?Windows server 2003安装IIS教程

Windows 2008系统服务器安装IIS之前已经分享过了,和Windows 2003完全不同,今天飞飞将详细地和你分享Windows server 2003卸载和安装IIS的步骤方法,希望可以帮助到你~ 1、首先进入服务器,确定下服务器是否有安装IIS,有…

漫谈数据库表设计及索引设计

一.数据库表设计 在数据库表设计上有个很重要的设计准则,称为范式设计。 什么是范式设计? 范式来自英文Normal Form,简称NF。MySQL是关系型数据库,但是要想设计—个好的关系,必须使关系满足一定的约束条件&#xff0c…

论如何用C语言的数组手撕一棵特殊的完全二叉树----堆

目录 0.前言 1. 用数组表示存储一棵完全二叉树 2. 数组表示的完全二叉树的性质 3. 堆的基本概念 3.1 堆的核心性质 3.2 堆顶的性质 3.3 堆的单支性质 3.4 堆的左右支关系 4. 用代码实现堆 4.1 堆类的实现 4.2 堆的初始化 4.3 堆的销毁 4.4 获取堆顶的数据 4.5 …

这款 Python 工具进行数据分析及数据可视化真的很棒啊

前言 大家好,今天我们以全国各地区衣食住行消费数据为例,来分析2022年中国统计年鉴数据,统计全国各地人民的消费地图,看看: 哪个省份的人最能花钱 哪个省份的人最舍得花钱 哪个省份的人最抠门 全国各地区人民在吃、穿…

一文读懂SpringBoot整合Elasticsearch(一)

(本篇文章主要介绍Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。) 一、前言 Elasticsearch是一款全文搜索引擎,可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…

JUC【Callable、ReentrantLock、Semaphore、CountDownLatch】

JUC > java.util.concurrent JUC标准库提供的多线程安全相关的包 Callable 接口声明带返回值的任务 类似于Runnable,都是用来描述这个线程的工作的。 Callable描述的任务带返回值,Runnable描述的任务不带返回值 区别:线程封装了一个 “返回值”&#…

【项目精选】基于网络爬虫技术的网络新闻分析(视频+论文+源码)

点击下载源码 基于网络爬虫技术的网络新闻分析主要用于网络数据爬取。本系统结构如下: (1)网络爬虫模块。 (2)中文分词模块。 (3)中3文相似度判定模块。 (4)数据结构化存…

【Python - Matplotlib】P2 plot 折线图

Matplotlib绘制折线图折线图完整代码与效果基础折线图设定横纵坐标设置中文显示添加网格添加描述信息再添加一个城市设置两个折线图前言 上一节内容主要围绕介绍 Matplotlib 的画板结构。 链接:https://blog.csdn.net/weixin_43098506/article/details/129331576 本…

云HIS系统 云his系统源码 基于电子病历的医院信息平台标准建设

云HIS系统 云his系统源码 基于电子病历的医院信息平台标准进行建设 云HIS系统采用SaaS软件应用服务模式,提供软件应用服务多租户机制,实现一中心部署多机构使用。相对传统HIS单机构应用模式,它可灵活应对区域医疗、医疗集团、医联体、连锁诊…

GB28181国标平台LiveGBS视频统一汇聚后如何获取固定的播放地址,实现监控视频Web页面无插件播放、拉流分析、上大屏等目的...

目前汇聚各种厂家监控设备的视频汇聚平台,基本都是通过GB28181标准协议实现的。下面介绍下LiveGBS Web无插件直播的GB28181视频平台将各厂家(包括海康、大华、华为、宇视、天地伟业等)监控汇聚到同一个服务器上后,如何或者直播链接可以直播浏览器播放&am…

flstudio21水果language选项中文设置方法教程

编曲是通过DAW(数字音频工作站软件)完成的,也就是我们常说的宿主软件。现在有很多优秀的宿主软件,例如Cubase、Studio One、FL Studio等。 FL Studio是一款功能强大的音乐制作软件,也被称为FruityLoops。目前已经推出…

Android上传手机图片到服务器(这篇你要是看不懂,全网没你可以看懂的了!!!)

Android上传手机图片到服务器1、整体流程2、页面布局3、选择图片流程实现演示结果完整代码4、路径转换路径转换Utils工具类权限申请完整代码5、创建文件6、服务器端7、传输8、演示9、完整代码目录结构AndroidManifest.xml布局文件activity_main.xml传输文件工具类HttpUtil路径转…

蓝桥杯-质因数个数

蓝桥杯-质因数个数1、问题描述2、解题思路2.1 质数判断2.2 求取因子3、完整代码实现1、问题描述 给定正整数 n, 请问有多少个质数是 n 的约数。 输入格式 输入的第一行包含一个整数 n。 输出格式 输出一个整数, 表示 n 的质数约数个数。 样例输入 396样例输出 3样例说明 3…

【教学典型案例】13.学情页面逻辑问题

目录一:背景介绍二:LocalStorage缓存①localStorage是什么?②如何使用localStorage缓存三:学情页面逻辑分析过程四:总结五:升华一:背景介绍 使用的前端技术是Vue2,前端逻辑&#xf…

SpringCloud:Eureka

目录 一、eureka的作用 二、搭建Eureka服务端 三、添加客户端 四、服务发现 提供者与消费者 服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) 服务消费者:一次业务中,调用其它微服务的服…

[1.1_2]计算机系统概述——操作系统的四个特征

文章目录第一章 计算机系统概述操作系统的特征(一)并发(二)共享并发和共享的关系(三)虚拟(四)异步小结第一章 计算机系统概述 操作系统的特征 操作系统的四个特征 并发共享 并发和共…

Linux学习第七节-SUID、SGID、SBIT特殊权限

1.SetUID特殊权限 setUID (SUID): 对于一个可执行的文件使用SUID权限后,普通用户在执行改文件后,临时拥有文件所有者的身份,该权限只在程序执行过程中有效,程序执行完毕后用户恢复原有身份。 SetUID权限会附加在所有者的x权限位上…

每日分享(2023最新文件快递柜系统网站源码 匿名口令分享临时文件分享)

​demo软件园每日更新资源,请看到最后就能获取你想要的: 1.UML参考手册(第二版) 中文 中文名: UML参考手册(第二版)原名: The Unified Modeling Language Reference Manual(2nd Edition) 作者: James Rumbaugh Ivar Jacobson Grady Booch译者: UML Ch…

汇编语言程序设计(二)之寄存器

系列文章 汇编语言程序设计(一) 寄存器 在学习汇编的过程中,我们经常需要操作寄存器,那么寄存器又是什么呢?它是用来干什么的? 它有什么分类?又该如何操作?… 你可能会有许多的…