【Rust深入浅出-5】拓展数据类型

2023-05-16

【Rust深入浅出-5】拓展数据类型

第一章Hello World!
第二章 变量和基本数据类型
第三章 运算符
第四章 类型转换
第五章 拓展数据类型


文章目录

  • 【Rust深入浅出-5】拓展数据类型
  • 前言
  • slice切片
  • tuple元组
    • 索引
    • match模式匹配
  • array普通数组
  • vec向量数组
  • 总结


前言

Rust深入浅出教程第5章《拓展数据类型》
本章节将介绍rust中其他的类型和复合类型 ,想要快速入门Rust的朋友可以先跳到第7章控制流再调回来。此外,本章涉及了借用,模式匹配等额外的知识,难以理解的话,可以先去相应章节了解一下
事实上,相当大一部分并不算类型,本质是封装好的结构体,只不过在别的语言里,它们通常都是直接的数据类型,为了方便理解,我们统一将它们视为数据类型


slice切片

Slice想必大家都不陌生了,在任何一门语言中都会接触到。
Silce一种是基于连续数组的衍生基本类型,用于String,普通数组,Vec数组或者集合(这些稍后会介绍)等
假设:作用对象S
格式:let slice = &slice[a…b]
切片是借用连续元素中的一部分,因此当被引用的对象发生了变化,slice也就变了
a…b是索引范围,前开后闭

索引切片的几种写法

  1. 从某处开始全部:a…
  2. 从开始到某处之间:…b
  3. 从某处到某处之间:a…b

示例代码

let a = [1,2,3,4,5,6];	//这是一个整数数组
let s1 = &a[0..3];	//s切片包含从下标0到下标3之间的3个元素:1,2,3
let s1 = &a[1..];	//s包含从下标1开始全部的5个元素:2,3,4,5,6
let s1 = &a[..2];	//s包含从开始到下标2之间的2个元素:1,2

slice本身也可以再次被切片

let s2 = &s1[0..1];	//引用上面s1的第0~1的元素,即第一个元素

tuple元组

tuple是一种复合类型,rust中元组以连续的方式存储不同类型的数据,定义时,可以不声明每个元素的类型,虽然tuple是连续的,不过它不能被切片
格式

let tup1 = (2023,6.66,"rust");

元组的长度是固定的,声明了一个元组变量后,不能再对其增减元素了,但是可以修改元素的值
如何访问元组的元素呢?有两种方法

索引

利用索引取值,格式:.index

println("{:?}", tup1.0);	//输出2023

如果要修改某个元素的值,那么在声明tuple时应加上前缀mut

match模式匹配

Js中我们面对后端传来的数据结构命名不喜欢时,常常会用match匹配来获取值
Rust的match也差不多是这样,利用模式匹配复制值到新的变量上:

let (x,y,z) = tup1;		//x为2023,y为6.66,z为rust

array普通数组

array是一个复合类型,代表着N个类型为T的元素的集合

格式: List 赋值声明(类型声明可以省略)

let arr: [i32;3] = [1,2,3];

访问数组元素:索引

println!("arr: {:?}", arr[0]);

array数组一旦声明,长度不可改变,如要想修改元素值,声明时应加上mut前缀

let mut arr: [i32;3] = [1,2,3];
arr[0] = -1;

获取数组长度:len()

println!("arr length: {}", arr.len());

遍历
正常for in, loop和while操作即可

for e in arr {
	println!("{}", arr);
}

let mut i = 0;
loop {
	if i >= arr.len() {
		break;
	}
	println!("{}", arr[i]);
	i += 1;
}

vec向量数组

vec和array一样是连续存储数据的,不过vec是动态数组,长度是可变的,相当于是array的一个拓展,同样的,vec元素的类型必须一致。动态的前提得是加上了mut前缀,否则和array也没有区别了
格式:

  1. 用Vec::new()创建一个空数组
let mut vec = Vec::new();

如果你不立即往vec内加入一个元素,应当显示声明vec数组的元素类型

  1. 用vec!宏带值创建一个数组
    声明时若不带上mut,那vec和非mut的array就一样不可变了
let mut vec = vec![1,2,3];

vec!宏可以不声明类型,编译器会根据元素自动推断

新增元素:push(elem)
vec比较像栈,向vec数组添加元素时,会追加到数组的末尾,此外类似栈的特性还不止这个

vec.push(4);

删除元素:remove(index)

vec.remove(3);	//把刚刚加入的4给删了

如果被删除的元素后面还有元素,所有的元素前进一位

查找元素:contain(&elem)
查找元素的入参应当以借用的形式(&),返回类型为bool

let has: bool = numvec.contains(&3);

访问/修改元素:索引
像普通数组那样访问即可,如果要修改,则应当为mut的vec数组

vec[0] = -1;
println!("{}", vec[0]);

获取长度:len()

遍历
遍历这里需要额外的两个知识点,借用和循环,有需要的可以去相应章节了解
循环的三种方式,for, loop和while,loop和while像上面array一样操作就可以,但是for有区别
for in 是我们平常使用最多的循环,你可以像上面array那样遍历vec数组:

for e in numvec {
    println!("{e}");
}
println!("numvec: {:?}",numvec);

编译器报警了,它告诉你对于最后的那个println,numvec已经被移除了
这个问题涉及到借用和生命周期的知识,在这里不做介绍,有需要可以去相应章节了解
利用for in 遍历借用的vec数组:

for e in &numvec {
    println!("{e}");
}
println!("numvec: {:?}",numvec);

这个时候就没有问题了

总结

本章简单了介绍了几种建立在第4章基本类型上的简单且常用的数据类型,slice,tuple,array和vec,如果掌握文中的基本用法,再结合后续的控制流,勉强能用rust写出简单的业务代码了。
下一章,将再介绍几个不常用或者特定情况下使用的数据类型,当然只是进行浅层的介绍,较难的部分或者说级运用,无论是基础类型还是拓展类型,都会后续单开一章为其详解。

下一章 拓展数据类型2(暂待)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Rust深入浅出-5】拓展数据类型 的相关文章

随机推荐

  • 尚硅谷hadoop3.x集群配置笔记及常见错误解决方式

    1 搭建集群准备工作 总体流程 准备3台客户机 xff08 关闭防火墙 静态IP 主机名称 xff09 安装JDK 配置环境变量 安装Hadoop 配置环境变量 配置集群 单点启动 配置ssh 群起并测试集群 一 模板虚拟机的搭建 配置要求
  • Centos 7系统下NTP时间同步服务配置

    NTP分为服务器端与客户端 xff08 自己选择某一台机器为服务器端 xff0c 其他机器则为客户端 xff09 xff0c 其中 xff0c 客户端通过向服务器端发送时间同步请求实现整个集群的时间同步 具体操作步骤如下所示 xff1a 1
  • EduCoder-程序设计技术R(第四部分循环结构程序设计1)- 第5关:求sn=a+aa+aaa+aaaa+......的值

    大家好鸭 x1f60e xff0c 前几期的EduCoder题解 xff0c 阅读量超过了之前的好多文章 xff01 谢谢大家的阅读 如果题目AC的话 xff0c 求一个免费的赞噢 x1f47b 如果有编程相关的问题 xff0c 可以一起交
  • 和风天气获取天气情况

    和风天气api xff08 实时天气 xff09 https dev qweather com docs api weather weather now 控制台 https console qweather com apps 1 进入控制台
  • Java习题练习:组队

    目录 题目描述 思路 其他真题 题目描述 作为篮球队教练 你需要从以下名单中选出1 号位至5 号位各一名球员 组成球队的首发阵容 每位球员担任1 号位至5 号位时的评分如下表所示 请你计算首发阵容1 号位至5 号位的评分之和最大可能是多少
  • 基于朴素贝叶斯分类器的西瓜数据集(实战)

    最近刚开始学习机器学习中的朴素贝叶斯分类器 xff0c 用西瓜数据集做了一下 xff0c 最后结果预测正确率75 xff0c 其中运用到的python语法并不复杂 xff0c 适合小白观看 目录 朴素贝叶斯分类器思想的自然语言描述 xff1
  • Golang将密码盐加密

    代码地址 xff1a https gitcode net m0 51510236 go password 首先我们来初始化一个项目 go mod init go password golang密码加密我们可以使用 golang org x
  • Spring使用SpringJUnit4ClassRunner时出现java.lang.NoSuchMethodError错误

    报错情况如下 xff1a java lang NoSuchMethodError org springframework core annotation AnnotatedElementUtils getAnnotationAttribut
  • 自己动手搭建网站:electerm远程连接云服务器,部署环境并发布第一个静态页面

    上篇写了云服务器和域名的选购 xff0c 这篇接上篇 xff0c 记录一下如何远程连接云服务器 xff0c 并发布第一个静态网页 xff0c 环境部署在另一篇博文里 xff1a Linux xff08 CentOS7 xff09 下配置jd
  • 解决IDEA报错Failed to start bean ‘documentationPluginsBootstrapper‘

    前言 白嫖容易 xff0c 创作不易 xff0c 若以下方案解决了问题烦请点赞支持一下 xff08 关注一下更好 xff09 在使用IDEA做项目时使用了Swagger进行接口文档的处理 swagger 使用的版本为2 9 2 xff0c
  • C语言%d输出的不同形式

    d就是普通的输出 2d是将数字按宽度为2 xff0c 采用右对齐方式输出 xff0c 若数据位数不到2位 xff0c 则左边补空格 2d是将数字按宽度为2 xff0c 采用左对齐方式输出 xff0c 若数据位数不到2位 xff0c 则右边补
  • latex常用语法

    字母表 字母上面的上标输入方法 xff0c 如右图所示 xff0c 如 bar a 表示字母a头上有一横线 小写希腊字母的输入方法 xff0c 如右图所示 xff0c 大写希腊字母的输入方法 xff0c 如右图所示 xff0c 大写希腊字母
  • Centos 7 内核升级

    一 升级至最新版本内核 1 升级系统包 xff0c 命令如下 yum update y 2 升级内核 xff0c 命令如下 rpm import http www elrepo orq RPM GPG KEY elrepo orq rpm
  • Win11安装Android子系统

    目录 一 获取安卓子系统安装包 二 安装Hyper v 三 运行Android安装包 四 安装组策略编辑器 五 配置Android环境 六 安装安卓apk格式app 一 获取安卓子系统安装包 百度云盘获取包 链接 xff1a https p
  • python-切割字符串成为列表(split函数)

    split函数切割字符串成为列表 在python的input时 xff0c 我们接收都是string类型 information span class token operator 61 span span class token buil
  • MyBatis实现分页查询

    目录 一 基于注解的简单分页查询 1 定义对象 2 Mapper接口 3 Controller类 4 功能实现 二 基于注解的较复杂分页查询 1 定义shop实体类和page分页类 2 Mapper接口 3 Controller类 4 功能
  • python 读取word表格中的表格

    解决方案 xff1a 在网上没有找到可行的嵌套表格内容读取方法 查看python docx包源代码找到以下两种解决方案 xff1a 方案一 xff1a 按行列读到单元格后再取tables xff0c 此处table cell tables值
  • sublime配置C/C++并调试

    文章目录 前言1 工具准备1 1 sublime的安装1 2 MinGw的安装和配置 2 开始配置2 1 MinGw路径放进环境变量2 2 sublime的配置 3 开始使用3 1 运行代码3 2 调试代码 前言 本文主要讲关于sublim
  • 洛谷P1025 [NOIP2001 提高组] 数的划分(DP)

    题目描述 将整数 n n n 分成 k k k 份 xff0c 且每份不能为空 xff0c 任意两个方案不相同 xff08 不考虑顺序 xff09 例如 xff1a
  • 【Rust深入浅出-5】拓展数据类型

    Rust深入浅出 5 拓展数据类型 第一章Hello World 第二章 变量和基本数据类型 第三章 运算符 第四章 类型转换 第五章 拓展数据类型 文章目录 Rust深入浅出 5 拓展数据类型前言slice切片tuple元组索引match