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 内存管理

Download history 13/week @ 2024-03-10 29/week @ 2024-03-31 4/week @ 2024-04-07 6/week @ 2024-04-14 17/week @ 2024-04-21 4/week @ 2024-04-28 16/week @ 2024-05-05 25/week @ 2024-05-12 18/week @ 2024-05-19 12/week @ 2024-05-26 13/week @ 2024-06-02 27/week @ 2024-06-09 30/week @ 2024-06-16 17/week @ 2024-06-23

88 每月下载量

Zlib OR Apache-2.0 OR MIT

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个函数外,还提供了两个扩展特性,分别是 ArrayExtSliceExt,它们提供了与自由函数相同的功能。

所有这些函数都具有一个共同特性:如果任何项的初始化失败(即发生堆栈回溯),则已初始化的所有项都将被丢弃,以最大限度地减少内存泄漏的风险。

示例


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]);

无运行时依赖

功能