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