span
Apache-2.0 许可证
一个用于处理闭开区间与闭无限区间的 Rust 轻量库,核心提供 Span<T> 泛型枚举类型,标准化管理有限/无限区间,支持区间包含判断、大小计算、迭代等核心能力,且完全适配 Rust 原生区间类型(Range/RangeFrom)。
本库仅依赖
num-traits(数值能力扩展)和thiserror(错误处理),无其他冗余依赖,可无缝集成到各类 Rust 项目中。
主要特性
- 双区间类型支持:同时兼容有限闭开区间(
[start, end))与无限闭区间([start, +∞)) - 完善的区间判断:支持元素归属判断、空区间判断、区间包含关系判断(A区间是否完全包含B区间)
- 便捷的元信息获取:快速获取起始/结束值、区分有限/无限区间类型、转换原生区间类型
- 实用数值计算:支持有限区间的大小计算,空区间/无限区间返回明确的结果/错误
- 原生 Trait 适配:实现
From(兼容 Rust 原生Range/RangeFrom)、Default、Iterator、Display等核心 Trait - 泛型兼容:适配所有满足
PartialOrd/Copy/Sub等基础约束的数值类型(如u8/u32/i64等)
适用场景
- 标准化管理数值区间(如分块存储、数据分片、索引范围界定)
- 需区分有限/无限区间并统一处理(如资源分配、任务调度的范围定义)
- 需对区间进行迭代、包含判断、大小计算的场景(如算法优化、数据校验)
快速开始
添加依赖
在 Cargo.toml 中引入本库:
[]
= "0.1.0" # 替换为实际版本号
= "0.2"
= "1.0"
核心使用示例
use Span;
use ;
主要 API 概览
核心枚举:Span<T>
| 变体 | 含义 |
|---|---|
Finite(Range<T>) |
有限闭开区间 [start, end) |
Infinite(RangeFrom<T>) |
无限闭区间 [start, +∞) |
基础构造/转换方法
| 方法 | 功能 |
|---|---|
Span::new_finite(start: T, end: T) |
构造有限区间 |
Span::new_infinite(start: T) |
构造无限区间 |
Span::from_finite(range: Range<T>) |
从原生 Range 转换 |
Span::from_infinite(range: RangeFrom<T>) |
从原生 RangeFrom 转换 |
From<Range<T>> for Span<T> |
原生 Range 隐式转换 |
From<RangeFrom<T>> for Span<T> |
原生 RangeFrom 隐式转换 |
元信息获取方法
| 方法 | 功能 |
|---|---|
start(&self) -> &T |
获取区间起始值 |
end(&self) -> Option<&T> |
有限区间返回结束值,无限区间返回 None |
as_finite(&self) -> Option<&Range<T>> |
转换为有限区间引用(非有限则返回 None) |
as_infinite(&self) -> Option<&RangeFrom<T>> |
转换为无限区间引用(非无限则返回 None) |
is_finite(&self) -> bool |
判断是否为有限区间 |
is_infinite(&self) -> bool |
判断是否为无限区间 |
判断类方法(T: PartialOrd)
| 方法 | 功能 |
|---|---|
contains<U>(&self, item: &U) -> bool |
判断元素是否包含在区间内 |
is_empty(&self) -> bool |
判断是否为空区间(仅有限区间可能为空) |
contains_span(&self, other: &Self) -> bool |
判断当前区间是否完全包含另一个区间 |
计算类方法(T: Sub + Copy + PartialOrd)
| 方法 | 功能 |
|---|---|
size(&self) -> Result<Option<O>, SpanError> |
有限非空区间返回大小,空区间返回 EmptyFiniteSpan 错误,无限区间返回 None |
Trait 实现
| Trait | 功能 |
|---|---|
Default |
默认返回 T::default()..(无限区间) |
Iterator |
有限区间迭代至结束值,无限区间持续迭代(T: One + CheckedAdd + PartialOrd + Copy) |
Display |
格式化输出(有限区间 [start, end),无限区间 [start, +∞)) |
Clone/PartialEq/Eq/Hash/Debug |
基础数据特性支持 |
设计与注意事项
- 空区间定义:仅有限区间可能为空(
start >= end时判定为空),无限区间永远非空; - 迭代行为:有限区间迭代从
start到end-1终止,无限区间会持续生成下一个值(需手动终止,避免死循环); - 泛型约束:不同方法对泛型
T有不同约束(如size需Sub,Iterator需CheckedAdd + One),使用时需满足对应约束; - 错误处理:区间大小计算通过
SpanError::EmptyFiniteSpan明确标识空区间错误,便于调用方处理; - 类型安全:通过枚举严格区分有限/无限区间,避免混用导致的逻辑错误。
示例与调试
仓库源码包含完整的注释与示例,重点关注:
Span::contains_span的区间包含逻辑(有限/无限区间的不同判断规则);Iterator实现的迭代逻辑(有限区间终止条件、无限区间持续迭代);size方法的错误处理(空区间的错误返回、无限区间的None返回)。
TODO / 未来规划
- 新增区间交集、并集、差集计算能力;
- 支持区间截断、偏移等操作;
- 补充更多数值类型的测试用例(如
i8/f64等); - 完善多语言文档与使用示例。
贡献
欢迎提交 PR 与 Issue。
联系
详见仓库所有者主页 Milk-COCO