rust数组类型
【摘要】 Rust 数组的核心是:类型签名为 [T; N],元素类型相同,长度 N 在编译期已知,且长度本身就是类型的一部分。基本类型写法let a: [i32; 5] = [1, 2, 3, 4, 5]; // 显式类型:[i32; 5]let b = [1, 2, 3]; // 编译器推断为 [i32; 3]let c: [i32; 100] = [0; ...
Rust 数组的核心是:类型签名为 [T; N],元素类型相同,长度 N 在编译期已知,且长度本身就是类型的一部分。
基本类型写法
let a: [i32; 5] = [1, 2, 3, 4, 5]; // 显式类型:[i32; 5]
let b = [1, 2, 3]; // 编译器推断为 [i32; 3]
let c: [i32; 100] = [0; 100]; // 重复初始化
[i32; 3] 和 [i32; 4] 是不同类型,不能互相赋值。
创建方式
- 列举元素:``
- 重复初始化:
[0; 5],要求元素类型实现Copy - 复杂类型初始化:使用
std::array::from_fnlet arr: [String; 3] = std::array::from_fn(|i| format!("item_{}", i));
访问与遍历
let arr = [10, 20, 30];
println!("{}", arr[0]); // 索引访问,越界会 panic
println!("{}", arr.len()); // 长度
// 安全访问
match arr.get(5) {
Some(v) => println!("{}", v),
None => println!("越界"),
}
// 遍历
for x in arr { println!("{}", x); } // 移动(Copy 类型会复制)
for x in &arr { println!("{}", x); } // 借用
数组 vs 切片 vs Vec
| 类型 | 签名 | 特点 |
|---|---|---|
| 数组 | [T; N] |
栈分配,长度编译期固定,零开销 |
| 切片 | &[T] |
胖指针(指针+长度,16字节),借用视图,不拥有数据 |
| Vec | Vec<T> |
堆分配,动态可变,可 push/pop |
切片是函数参数的首选,因为它可以接受任意长度的数组或 Vec:
fn process(data: &[i32]) {
println!("len={}, data={:?}", data.len(), data);
}
let arr = [1, 2, 3];
let v = vec![1, 2, 3, 4];
process(&arr); // 数组自动转为切片
process(&v); // Vec 也可以
函数传参的几种写法
fn by_value(arr: [i32; 3]) {} // 按值拷贝,只接受长度=3
fn by_ref(arr: &[i32; 3]) {} // 数组引用,仍限定长度
fn by_slice(data: &[i32]) {} // 切片,通用推荐写法
fn by_mut(data: &mut [i32]) {} // 可变切片,可修改元素
关键注意点
- 长度必须是编译期常量,不能用变量作为长度。
- 索引越界会 panic,建议用
.get()安全访问。 - 数组默认不可变,修改元素需
mut。 - 非
Copy类型(如String)不能用[expr; N]语法。 - 从 Rust 1.51 起支持 const 泛型,可以写泛型数组:
struct Buffer<const N: usize> { data: [u8; N], }
简单记忆:数组是编译期固定大小的栈上数据,切片是运行期的借用视图,Vec 是堆上的动态数组。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)