1 个稳定版本
1.0.0 | 2024 年 3 月 5 日 |
---|
#2289 在 Rust 模式
12KB
324 行
数组 EX
该软件包提供了一种简单且强大的方法,用于在编译时初始化数组。
const ARRAY: [usize; 8] = array_ex::array![
// specify element type
usize,
// add 1, 2, 3
[1, 2, 3],
// add zero until 8 elements
[0; ..8]
];
assert_eq!(
ARRAY,
[1, 2, 3, 0, 0, 0, 0, 0],
)
有多种方法可以添加数组元素
array![usize,
// directly add elements
[1, 2, 3, 4],
[1; 4],
// cycle all elements n times
[* [1, 2, 3]; 3]
// repeat element until array contains n elements
[0; ..10],
// cycle elements until array contains n elements
[* [1, 2, 3]; ..10],
// add another instantiated array
[* array![usize, [1, 2, 3], [0; ..5]] ],
// cycle another instantiated array
[* array![usize, [1, 2], [0; ..4]]; 3],
// add another constant array
[* OTHER_CONSTANT_ARRAY],
];
为什么?
默认情况下,Rust 的编译时数组初始化方法不太有用。您必须手动指定每个元素([a, b, c]
),或者您只能使用单个元素([a; n]
)。此宏涵盖了更多用于初始化静态数组的用例。
注意事项
- 需要使用
*
符号来区分循环元素与构建数组数组的结构。例如,如果不这样,array![ [usize; 2], [[1, 2]; 3] ]
就无法正确解析。 - 错误信息不太美观。
- 使用了不安全代码来避免要求元素类型必须实现
Default
。代码是安全的 - 确保数组在编译时构建,这会自动检查 UB。 - 可能存在一些情况,其中由函数调用定义的元素(例如
array![u8, [* gen_array(); 100]]
)将多次构建。这可能会导致编译时间过长。您可以将这些函数调用提取出来以避免重新生成数组。 - 通常构建大型数组会降低编译时间。构建通常是瞬时的,直到 10_000 个元素。