2 个版本
0.1.1 | 2023年9月19日 |
---|---|
0.1.0 | 2023年9月17日 |
15 in #arrays
7KB
arrayinit
一个无需依赖、无标准库、极其简单且小巧的 crate,用于动态创建固定大小的数组。
默认情况下,当构造一个数组 [T; N]
时,Rust 允许两种初始化数组的方式。例如,它允许命名数组中的所有元素,如:[1, 2, 3, 4]
,或者为所有数组条目提供一个默认值 ["Hello"; 5]
。
这种方法存在一些缺点——特别是对于泛型大小的数组。特别是,目前 Rust 在此情况下初始化具有不同值的数组时,不够详细。
当 T
是一个不实现 Copy
(例如,String
类型)的所有权类型时,会出现一个主要问题。由于 N
,数组的尺寸是泛型定义的——我们被迫用 [concrete_value; N]
初始化数组,这不会编译,因为 concrete_value
的类型是 T
,它不是 Copy
。为了正确初始化此类数组,需要使用一些丑陋的技巧。
此 crate 旨在解决这个问题,并允许以非常简单的方式实现更动态的初始化。
示例用法
可以使用此 crate 中定义的多个方法使用 arr!
宏。最通用的方式是提供一个 producer
方法,并给出数组的尺寸。
let array = arr![|idx| idx * 2; 4];
assert_eq!(array, [0, 2, 4, 6]);
也可以省略数组的尺寸,让编译器自己确定
let array = arr![|idx| idx * 2];
// We need to use the array somewhere to help the compiler understand whats its size should be
assert_eq!(array, [0, 2, 5, 6, 8, 10]);
如果您愿意,也可以静态初始化所有元素
let array = arr![1, 2, 3]; // Equivalent to `[1, 2, 3]`
assert_eq!(array, [1, 2, 3]);