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 模式

Download history 39198/week @ 2024-03-14 39158/week @ 2024-03-21 38106/week @ 2024-03-28 36896/week @ 2024-04-04 40724/week @ 2024-04-11 41793/week @ 2024-04-18 38082/week @ 2024-04-25 42019/week @ 2024-05-02 59053/week @ 2024-05-09 60215/week @ 2024-05-16 72500/week @ 2024-05-23 67725/week @ 2024-05-30 60821/week @ 2024-06-06 62247/week @ 2024-06-13 65950/week @ 2024-06-20 51897/week @ 2024-06-27

每月下载量 252,133
用于 195 个crate(47 个直接使用)

MIT 许可证

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::firstNonEmpty::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