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 在 算法 中
1,215,755 每月下载量
在 1,300 个crate中使用了(直接使用2个)
31KB
335 行
Unarray
处理未初始化数组的小工具
- 无依赖
#[no_std]
- 无panic(所有API返回
Result
或Option
)
此crate提供了一些API集合
uninit_buf
和 mark_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 License,版本2.0(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,将按照上述方式双重许可,不附加任何额外的条款或条件。