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

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

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



前言

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(暂待)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值