阅读 217

rust的数组介绍

这是我参与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
复制代码

对于DSTrust有以下的限制:

  • 只能通过指针来间接创建和操作DST类型
  • 局部变量和函数参数不可以是DST类型,
  • enum不能包含DSTstruct只有最后一个元素可以是DST。 综上看来rust对于DST的设计,使得rust的类型系统更为丰富,使用DST我们可以为它实现trait,用作泛型参数等。而胖指针的设计使得数组在作为参数传递的时候避免了自动退化为裸指针的问题以及丢失长度的问题,保证了类型的安全。
文章分类
后端
文章标签