这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
数组
数组介绍
数组是一个容器,它在一块连续空间内存中,存储了 系列的同样类型的数据 数组中 元素的占用空间大小必须是编译期确定的 数组本身所容纳的元素个数也必须是编译期确定 的,执行阶段不可变 如果需要使用变长的容器,可以使用标准库中的Vec/LinkedList
数组类型的表示方式为[T;m]
其中T
代表元素类型;n
代表元素个数;n
必须是一个编译期可以确定大小的常量整数;中间用分号隔开。
let arr = [1,2,3,4,5];
let arr_1 = [1;3];
let arr_2:[&str;5];
复制代码
数组类型
在rust中只有元素个数和元素类型都相同的数组才可是同类型的数组,数组与指针不存在隐式的转换,所以只有同类型的数组才可以相互赋值使用。
数组的迭代器
对于数组的便利通常我们需要使用for循环来遍历一个数组,rust
的数组本身并没有实现可迭代的trait
,但我们可以使用数组切片,数组切片实现了迭代器的trait
,这样有助于我们编写简单的代码实现遍历数组。
let arr = [1,2,3,4,5];
for i in &arr{
println!("{:?}", i);
}
复制代码
多维数组
rust
多维数组的定义如下:
let arr: [[i32;3];3] = [[1,1,1],[1,1,1],[1,1,1]];
for _i in &arr{
//...
}
复制代码
什么是数组切片
对数组实现borrow
操作,可以生成一个:数组切片(slice),数组切片并没有数组的所有权
,数组切片实际上相当于一个指向数组的指针,编译器通过内部操作使得我们可以通过&
操作来获取到数组的切片类型,数组切片实际上还是指针类型,只不过放弃了数组在编译阶段保存的长度信息,转而将长度信息变为运行期内的值。
DST以及胖指针
上面数组切片与数组的区别可以发现数组切片不止是一个指向数组的指针,同时还携带了数组的长度信息,有一个形象的名字叫做“胖指针”,而与“胖指针”对应的一个概念是“动态大小类型”(DST)。
println!("{:?}",std::mem::size_of::<&[i32;3]>());
println!("{:?}",std::mem::size_of::<&[i32]>());
//8
//16
复制代码
对于DST
,rust
有以下的限制:
- 只能通过指针来间接创建和操作
DST
类型 - 局部变量和函数参数不可以是
DST
类型, - enum不能包含
DST
,struct
只有最后一个元素可以是DST。
综上看来rust
对于DST
的设计,使得rust
的类型系统更为丰富,使用DST我们可以为它实现trait
,用作泛型参数等。而胖指针的设计使得数组在作为参数传递的时候避免了自动退化为裸指针的问题以及丢失长度的问题,保证了类型的安全。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END