5 个版本

0.1.4 2022年11月30日
0.1.3 2022年11月8日
0.1.2 2022年11月8日
0.1.1 2022年6月5日
0.1.0 2022年6月5日

308算法

Download history 247121/week @ 2024-03-14 268949/week @ 2024-03-21 259306/week @ 2024-03-28 264928/week @ 2024-04-04 270025/week @ 2024-04-11 277662/week @ 2024-04-18 263943/week @ 2024-04-25 274997/week @ 2024-05-02 271018/week @ 2024-05-09 286158/week @ 2024-05-16 284027/week @ 2024-05-23 313196/week @ 2024-05-30 306238/week @ 2024-06-06 303504/week @ 2024-06-13 290022/week @ 2024-06-20 251150/week @ 2024-06-27

1,215,755 每月下载量
1,300 个crate中使用了(直接使用2个)

MIT/Apache

31KB
335

Unarray

Docs badge crates badge github badge license badge

处理未初始化数组的小工具

  • 无依赖
  • #[no_std]
  • 无panic(所有API返回 ResultOption

此crate提供了一些API集合

uninit_bufmark_initialized

这些函数通常按以下方式使用

  • 使用 uninit_buf 栈分配一个未初始化的数组
  • 初始化每个元素
  • 使用 mark_initialized 不安全地将它转换为初始化的数组

例如

use unarray::*;

fn main() {
  let mut buffer = uninit_buf::<i32; 10>();

  for slot in &mut buffer {
    slot.write(123);
  }

  let array = unsafe { mark_initialized(buffer) };

  assert_eq!(array, [123; 10]);
}

这很简单易懂,但仍需要 unsafe,这在许多情况下难以证明

build_array_*

从长度和索引到值的映射函数构建数组的函数

let even_numbers = build_array(|i| i * 2);  // const generic length parameter inferred
assert_eq!(even_numbers, [0, 2, 4]);

let numbers = build_array_option::<usize, 3>(|i| 3.checked_sub(i));
assert_eq!(numbers, Some([3, 2, 1]));

let numbers = build_array_option::<usize, 5>(|i| 3.checked_sub(i));
assert_eq!(numbers, None);  // since a single element failed, the whole operation failed

还有一个返回 Result 的函数的等效函数 build_array_result

收集迭代器到数组

通常希望将迭代器收集到数组中,但在稳定的 Rust 中这很困难,因为迭代器不携带有关其长度的编译时信息。正因为如此,数组不实现 FromIterator,这是 .collect() 工作所必需的。

因此,此库提供了 ArrayFromIter,它 确实 实现 FromIterator。此结构可以解构为得到一个 Option<[T, N]>。如果迭代器包含正好 N 个元素,则这是 Some(array),否则它是 None

let iter = [1, 2, 3].into_iter();
match iter.collect() {
  ArrayFromIter(Some([a, b, c])) => println!("exactly 3 elements: {a}, {b}, {c}"),
  ArrayFromIter(None) => println!("not 3 elements"),
}

UnarrayArrayExt 扩展特质

// mapping an array via a `Result`
let strings = ["123", "234"];
let numbers = strings.map_result(|s| s.parse());
assert_eq!(numbers, Ok([123, 234]));

let bad_strings = ["123", "uh oh"];
let result = bad_strings.map_result(|s| s.parse::<i32>());
assert!(result.is_err());  // since one of the element fails, the whole operation fails

还有一个为返回 Option 的函数提供的 map_option

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,将按照上述方式双重许可,不附加任何额外的条款或条件。

无运行时依赖