rust数组类型

举报
yd_236198820 发表于 2026/11/12 10:27:46 2026/11/12
【摘要】 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_fn
    let 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。