Rust中数组初始化时是否可由编译器自动推断长度而无需显式声明?
问题1:数组初始化是否必须显式声明长度?
不需要,Rust编译器支持对数组类型的自动推导,只要给出了初始化表达式,你完全可以省略类型标注:
let nums = [1, 2, 3]; // 编译器会自动推导nums的类型为[i32; 3]
你示例中写出的[i32; 3]类型标注是完全可选的,不属于强制要求。
问题2:为什么追加元素后不能自动推断类型变为[i32; 4]?
Rust是静态类型语言,所有变量的类型在编译期就会完全确定,且变量类型一旦确定后全程不可修改。
而Rust的数组是栈分配的固定长度类型,长度本身就是数组类型的一部分:[i32; 3]和[i32; 4]是完全不同的两个类型,不可能在同一个变量上互相转换。
如果你需要运行时可以变更长度的序列,应该使用堆分配的动态数组Vec<T>:
let mut nums = vec![1, 2, 3]; nums.push(4); // 合法,Vec支持动态增减元素
问题3:为什么let nums: [i32] = [1, 2, 3];无法编译?
[T]在Rust中属于动态大小类型(DST,也叫Unsized Type),它的长度在编译期无法确定,因此不能直接在栈上分配,也不能直接作为栈变量的类型使用。
动态大小类型只能通过指针间接使用,常见的使用形式包括:
- 切片引用:
&[i32] - 堆分配不定长数组:
Box<[i32]>
内容的提问来源于stack exchange,提问作者Duane J
相关产品推荐
相关产品推荐

