16 个版本 (9 个破坏性更新)
| 0.10.0 | 2024年2月29日 |
|---|---|
| 0.9.0 | 2023年11月17日 |
| 0.8.1 | 2022年12月6日 |
| 0.8.0 | 2022年6月30日 |
| 0.1.5 | 2019年11月25日 |
#52 in Rust 模式
每月下载量 252,133
用于 195 个crate(47 个直接使用)
41KB
635 行
通过构造保证的非空列表
此包公开了一个类型 NonEmpty<T>,其数据表示保证了静态非空性
struct NonEmpty<T>(T, Vec<T>)
该库的接口设计得类似于 std::vec::Vec
use nonempty::NonEmpty;
let mut l = NonEmpty::new(42);
assert_eq!(l.first(), &42);
l.push(36);
l.push(58);
let v: Vec<i32> = l.into();
assert_eq!(v, vec![42, 36, 58]);
lib.rs:
非空可增长向量。
非空性可以是一个强大的保证。如果你主要使用 Vec 作为 Iterator,那么你可能不需要区分空与不空。但是,确实存在接收到的 Vec 作为函数参数需要非空的情况,否则你的函数无法进行。同样,也有将 Vec 返回给调用用户时需要保证它实际上包含某些内容的情况。
使用 NonEmpty,你将不再需要不断检查 is_empty() 或在继续之前进行模式匹配,或者如果无法执行则报错。因此,代码、类型签名和逻辑变得更加简洁。
请注意,与 Vec 不同,NonEmpty::first 和 NonEmpty::last 不返回 Option,它们总是成功的。
示例
构建 NonEmpty 的最简单方法是使用 nonempty 宏
use nonempty::{NonEmpty, nonempty};
let l: NonEmpty<u32> = nonempty![1, 2, 3];
assert_eq!(l.head, 1);
与熟悉的 vec! 宏不同,nonempty! 至少需要一个元素
use nonempty::nonempty;
let l = nonempty![1];
// Doesn't compile!
// let l = nonempty![];
与Vec一样,您也可以使用NonEmpty::new或其构造函数以传统方式构建一个NonEmpty。
use nonempty::NonEmpty;
let mut l = NonEmpty { head: 42, tail: vec![36, 58] };
assert_eq!(l.head, 42);
l.push(9001);
assert_eq!(l.last(), &9001);
如果需要,您也可以将其转换为Vec,或从Vec转换为它。
use nonempty::{NonEmpty, nonempty};
let l: NonEmpty<u32> = nonempty![42, 36, 58, 9001];
let v: Vec<u32> = l.into();
assert_eq!(v, vec![42, 36, 58, 9001]);
let u: Option<NonEmpty<u32>> = NonEmpty::from_vec(v);
assert_eq!(Some(nonempty![42, 36, 58, 9001]), u);
注意事项
由于NonEmpty必须至少有一个元素,因此无法为它实现FromIterator特质。通常情况下,我们无法确定任何给定的Iterator实际上是否包含内容。
特性
serialize:支持serde。arbitrary:支持arbitrary。
依赖
~200KB