7 个版本
0.3.0 | 2022年7月24日 |
---|---|
0.2.2 | 2022年1月14日 |
0.2.1 | 2021年9月9日 |
0.1.2 | 2021年6月4日 |
#371 in 内存管理
88 每月下载量
27KB
308 行
逐项初始化数组
通常,在使用固定大小数组时,您只能使用const值进行初始化。
示例
// Literals work.
let arr = [0; 5];
// Const values work too.
const STRING: String = String::new();
let arr = [STRING; 5];
// Function calls don't work.
let arr = [computation(); 5];
初始化数组项的方法有很多,包括
- 使用一个Option数组,将它们全部初始化为None,然后逐个初始化为Some(computation())。
- 使用Vec,并逐步向其中推送项目。
- 使用MaybeUninit数组,逐步初始化它们,然后转换数组。这需要使用unsafe代码。
此crate使用第三种方法,但通过安全接口隐藏它,因此用户端不需要unsafe代码。它提供了三个初始化数组项的函数
init_array
用于初始化基于栈的固定大小数组。init_boxed_array
用于初始化堆分配的固定大小数组。init_boxed_slice
用于初始化堆分配的动态大小切片。
还有一个try_init_array
函数,允许尝试初始化数组并提前返回错误。
如果您启用了nightly
功能,您将能够访问符合新分配器API的init_boxed_...
函数的附加版本。
如果您关闭默认启用的alloc
功能,您可以在没有分配器的情况下使用此crate在#[no_std]
上下文中。此crate完全兼容#[no_std]
。
除了上述提到的3个函数外,还提供了两个扩展特性,分别是 ArrayExt
和 SliceExt
,它们提供了与自由函数相同的功能。
所有这些函数都具有一个共同特性:如果任何项的初始化失败(即发生堆栈回溯),则已初始化的所有项都将被丢弃,以最大限度地减少内存泄漏的风险。
示例
use init_array::*;
let arr = init_array(|i| i * i);
assert_eq!(arr, [0, 1, 4, 9, 16]);
let arr = init_boxed_array(|i| i * i);
assert_eq!(arr, Box::new([0, 1, 4, 9, 16]));
let arr = init_boxed_slice(5, |i| i * i);
assert_eq!(&*arr, &[0, 1, 4, 9, 16]);
let mut state = 0;
let arr = init_array(move |i| {
state += i + 1;
state
});
assert_eq!(arr, [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]);