Rust 数组

文章目录

  • Rust 数组
    • 创建数组
    • 访问数组元素
    • 数组切片
    • 总结

Rust 数组

在 Rust 中,最常用的数组有两种,第一种是速度很快但是长度固定的 array,第二种是可动态增长的但是有性能损耗的 Vector;称 array 为数组,Vector 为动态数组。

和 &str 与 String 关系很像。

数组 array,将多个类型相同的元素依次组合在一起,就是一个数组。

  • 长度固定
  • 元素必须有相同的类型
  • 依次线性排列

强调 数组是 Rust 基础类型,固定长度的

创建数组

fn main() {
    let a = [1, 2, 3, 4, 5];
}

由于 元素类型大小固定,且长度也是固定,数组 array 是存储在栈上;与此对应,动态数组 Vector 是存储在堆上,长度可以动态改变。

为数组声明类型

let a: [i32; 5] = [1, 2, 3, 4, 5];

数组类型通过方括号语法声明,i32 是元素类型,分号后面的数字 5 是数组长度。

某个值重复出现 N 次的数组

let a = [3; 5];

5 个元素,且都初始化为 3。

访问数组元素

fn main() {
    let a = [9, 8, 7, 6, 5];

    let first = a[0]; // 获取a数组第一个元素
    let second = a[1]; // 获取第二个元素
}

越界访问

use std::io;

fn main() {
    let a = [1, 2, 3, 4, 5];

    println!("Please enter an array index.");

    let mut index = String::new();
    // 读取控制台的输出
    io::stdin()
        .read_line(&mut index)
        .expect("Failed to read line");

    let index: usize = index
        .trim()
        .parse()
        .expect("Index entered was not a number");

    let element = a[index];

    println!(
        "The value of the element at index {} is: {}",
        index, element
    );
}

程序会崩溃退出,the len is 5 but the index is 5',

测试访问越界程序 panic 退出,需要上面动态输入索引的方式;如下面在编译时已检查出问题。

fn main() {
    let a = [9, 8, 7, 6, 5];
    let last = a[5];
}

数组切片

数组切片允许我们引用数组的一部分。

let a: [i32; 5] = [1, 2, 3, 4, 5];
let slice: &[i32] = &a[1..3];
assert_eq!(slice, &[2, 3]);

上面的数组切片 slice 的类型是&[i32],与之对比,数组的类型是[i32;5],简单总结下切片的特点:

  • 切片的长度可以与数组不同,并不是固定的,而是取决于你使用时指定的起始和结束位置
  • 创建切片的代价非常小,因为切片只是针对底层数组的一个引用
  • 切片类型[T]拥有不固定的大小,而切片引用类型&[T]则具有固定的大小,因为 Rust 很多时候都需要固定大小数据类型,因此&[T]更有用,&str字符串切片也同理

总结

  • 数组类型容易跟数组切片混淆,[T;n]描述了一个数组的类型,而[T]描述了切片的类型, 因为切片是运行期的数据结构,它的长度无法在编译期得知,因此不能用[T;n]的形式去描述
  • [u8; 3] 和 [u8; 4]是不同的类型,数组的长度也是类型的一部分
  • 在实际开发中,使用最多的是数组切片[T],我们往往通过引用的方式去使用&[T],因为后者有固定的类型大小

数组分配在栈上, std::mem::size_of_val 函数会返回整个数组占用的内存空间

你可能感兴趣的:(Rust,rust,开发语言,后端)