nonempty_tools
优雅的 Rust 非空集合类型库,在编译时保证集合非空。
✨ 特性
- 零运行时开销 - 仅在初始化时验证非空
- 类型安全 - 编译时保证集合至少包含一个元素
- API 完整 - 提供与标准库类似的丰富 API
- 符合人体工程学 - 实现
Deref、Index、IntoIterator等标准 trait
📦 包含类型
| 类型 | 描述 |
|---|---|
NonEmptyVec<T> |
非空向量 |
NonEmptySliceRef<'a, T> |
非空切片引用(不可变) |
NonEmptySliceRefMut<'a, T> |
非空切片引用(可变) |
NonEmptyString |
非空字符串 |
NonEmptyStr<'a> |
非空字符串切片引用 |
NonEmptyVecDeque<T> |
非空双端队列 |
🚀 快速开始
use ;
// 创建非空向量
let vec = new;
assert_eq!; // 保证安全访问第一个元素
assert_eq!;
// 从现有集合创建
let vec = try_from_vec?;
// 非空字符串
let name = try_from_str?;
assert_eq!;
// 使用 into_inner 获取内部值
let inner_vec = vec.into_inner;
💡 设计原则
仅初始化时检验
所有非空类型只在构造时验证是否为空,之后不再有运行时检查:
// ✅ 构造时检验
let vec = try_from_vec?;
// ✅ 运行时零开销
let first = vec.first; // 无需 unwrap
不提供可能导致空集合的操作
只提供安全的操作,不提供 pop、remove、clear 等可能导致空集合的方法:
let mut vec = from_single;
vec.push; // ✅ 允许
vec.push; // ✅ 允许
// vec.pop(); // ❌ 不存在此方法
提供 into_inner 方法
如果需要执行可能导致空集合的操作,使用 into_inner 获取内部值:
let vec = new;
let mut inner = vec.into_inner;
inner.pop; // 现在可以自由操作
📚 API 示例
NonEmptyVec
use NonEmptyVec;
// 创建
let vec = new;
let vec = from_single;
let vec = try_from_vec?;
// 访问
let first = vec.first;
let last = vec.last;
let len = vec.len;
// 修改
let mut vec = from_single;
vec.push;
*vec.first_mut = 10;
// 迭代
for item in &vec
NonEmptyString
use NonEmptyString;
// 创建
let s = new;
let s = from_char;
let s = try_from_str?;
let s: NonEmptyString = "hello".parse?;
// 操作
let mut s = from_char;
s.push;
s.push_str;
assert_eq!;
NonEmptyVecDeque
use NonEmptyVecDeque;
use VecDeque;
let mut deque = from_single;
deque.push_front;
deque.push_back;
assert_eq!;
assert_eq!;
🔧 使用场景
- 用户输入验证 - 确保用户名、文件名等不为空
- 配置管理 - 保证至少有一个配置项
- 算法实现 - 需要非空保证的算法(如取最小值、最大值)
- API 设计 - 在类型层面表达"必须非空"的约束
📄 许可证
MIT OR Apache-2.0