在 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],简单总结下切片的特点:
数组分配在栈上,
std::mem::size_of_val
函数会返回整个数组占用的内存空间