| Crates.io | nonempty_tools |
| lib.rs | nonempty_tools |
| version | 0.1.0 |
| created_at | 2025-10-29 09:03:55.024982+00 |
| updated_at | 2025-10-29 09:03:55.024982+00 |
| description | 优雅的 Rust 非空集合类型库,在编译时保证集合非空 |
| homepage | |
| repository | https://github.com/ShaoG-R/nonempty_tools |
| max_upload_size | |
| id | 1906261 |
| size | 77,551 |
优雅的 Rust 非空集合类型库,在编译时保证集合非空。
Deref、Index、IntoIterator 等标准 trait| 类型 | 描述 |
|---|---|
NonEmptyVec<T> |
非空向量 |
NonEmptySliceRef<'a, T> |
非空切片引用(不可变) |
NonEmptySliceRefMut<'a, T> |
非空切片引用(可变) |
NonEmptyString |
非空字符串 |
NonEmptyStr<'a> |
非空字符串切片引用 |
NonEmptyVecDeque<T> |
非空双端队列 |
use nonempty_tools::{NonEmptyVec, NonEmptyString};
// 创建非空向量
let vec = NonEmptyVec::new(1, vec![2, 3, 4]);
assert_eq!(vec.first(), &1); // 保证安全访问第一个元素
assert_eq!(vec.len(), 4);
// 从现有集合创建
let vec = NonEmptyVec::try_from_vec(vec![1, 2, 3])?;
// 非空字符串
let name = NonEmptyString::try_from_str("Alice")?;
assert_eq!(name.as_str(), "Alice");
// 使用 into_inner 获取内部值
let inner_vec = vec.into_inner();
所有非空类型只在构造时验证是否为空,之后不再有运行时检查:
// ✅ 构造时检验
let vec = NonEmptyVec::try_from_vec(vec![1, 2, 3])?;
// ✅ 运行时零开销
let first = vec.first(); // 无需 unwrap
只提供安全的操作,不提供 pop、remove、clear 等可能导致空集合的方法:
let mut vec = NonEmptyVec::from_single(1);
vec.push(2); // ✅ 允许
vec.push(3); // ✅ 允许
// vec.pop(); // ❌ 不存在此方法
into_inner 方法如果需要执行可能导致空集合的操作,使用 into_inner 获取内部值:
let vec = NonEmptyVec::new(1, vec![2, 3]);
let mut inner = vec.into_inner();
inner.pop(); // 现在可以自由操作
use nonempty_tools::NonEmptyVec;
// 创建
let vec = NonEmptyVec::new(1, vec![2, 3]);
let vec = NonEmptyVec::from_single(42);
let vec = NonEmptyVec::try_from_vec(vec![1, 2, 3])?;
// 访问
let first = vec.first();
let last = vec.last();
let len = vec.len();
// 修改
let mut vec = NonEmptyVec::from_single(1);
vec.push(2);
*vec.first_mut() = 10;
// 迭代
for item in &vec {
println!("{}", item);
}
use nonempty_tools::NonEmptyString;
// 创建
let s = NonEmptyString::new('h', "ello");
let s = NonEmptyString::from_char('A');
let s = NonEmptyString::try_from_str("hello")?;
let s: NonEmptyString = "hello".parse()?;
// 操作
let mut s = NonEmptyString::from_char('h');
s.push('i');
s.push_str("!");
assert_eq!(s.as_str(), "hi!");
use nonempty_tools::NonEmptyVecDeque;
use std::collections::VecDeque;
let mut deque = NonEmptyVecDeque::from_single(2);
deque.push_front(1);
deque.push_back(3);
assert_eq!(deque.front(), &1);
assert_eq!(deque.back(), &3);
MIT OR Apache-2.0