#array #utility #macro #no-std

no-std array_ex

简单且强大的编译时数组初始化

1 个稳定版本

1.0.0 2024 年 3 月 5 日

#2289Rust 模式

MIT/Apache

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 个元素。

无运行时依赖