【Rust深入浅出-5】拓展数据类型
第一章Hello World!
第二章 变量和基本数据类型
第三章 运算符
第四章 类型转换
第五章 拓展数据类型
文章目录
- 【Rust深入浅出-5】拓展数据类型
- 前言
- slice切片
- tuple元组
-
- array普通数组
- vec向量数组
- 总结
前言
Rust深入浅出教程第5章《拓展数据类型》
本章节将介绍rust中其他的类型和复合类型 ,想要快速入门Rust的朋友可以先跳到第7章控制流再调回来。此外,本章涉及了借用,模式匹配等额外的知识,难以理解的话,可以先去相应章节了解一下
事实上,相当大一部分并不算类型,本质是封装好的结构体,只不过在别的语言里,它们通常都是直接的数据类型,为了方便理解,我们统一将它们视为数据类型
slice切片
Slice想必大家都不陌生了,在任何一门语言中都会接触到。
Silce一种是基于连续数组的衍生基本类型,用于String,普通数组,Vec数组或者集合(这些稍后会介绍)等
假设:作用对象S
格式:let slice = &slice[a…b]
切片是借用连续元素中的一部分,因此当被引用的对象发生了变化,slice也就变了
a…b是索引范围,前开后闭
索引切片的几种写法
- 从某处开始全部:a…
- 从开始到某处之间:…b
- 从某处到某处之间:a…b
示例代码
let a = [1,2,3,4,5,6];
let s1 = &a[0..3];
let s1 = &a[1..];
let s1 = &a[..2];
slice本身也可以再次被切片
let s2 = &s1[0..1];
tuple元组
tuple是一种复合类型,rust中元组以连续的方式存储不同类型的数据,定义时,可以不声明每个元素的类型,虽然tuple是连续的,不过它不能被切片
格式:
let tup1 = (2023,6.66,"rust");
元组的长度是固定的,声明了一个元组变量后,不能再对其增减元素了,但是可以修改元素的值
如何访问元组的元素呢?有两种方法
索引
利用索引取值,格式:.index
println("{:?}", tup1.0);
如果要修改某个元素的值,那么在声明tuple时应加上前缀mut
match模式匹配
Js中我们面对后端传来的数据结构命名不喜欢时,常常会用match匹配来获取值
Rust的match也差不多是这样,利用模式匹配复制值到新的变量上:
let (x,y,z) = tup1;
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也没有区别了
格式:
- 用Vec::new()创建一个空数组
let mut vec = Vec::new();
如果你不立即往vec内加入一个元素,应当显示声明vec数组的元素类型
- 用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);
如果被删除的元素后面还有元素,所有的元素前进一位
查找元素: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(使用前将#替换为@)