#range #intersection #inclusive #self #dont #range-util-t

range-utils

与范围一起工作的实用工具

3 个版本

0.1.3 2023年12月22日
0.1.2 2023年12月19日
0.1.1 2023年11月26日
0.1.0 2023年11月26日

#4 in #inclusive

MIT 许可证

9KB
123

range-utils

动机

标准库有 6(甚至更多?)种不同的范围类型,例如 0..=256..=2560....u8 中表示相同的范围(如 0..3..3 是一些未列出的更多范围)。标准库提供的唯一“实用工具”是 RangeBounds,如果需要更高级/通用化的使用,则相当无用。例如,.start_bound() 如果起始位置未定义,则不会返回实际的 start_bound,这使得为不同的范围类型实现函数变得更加困难。

用法

此软件包包含以下方法的 RangeUtil<T> 特质

  • starts_at(&self) -> T:包含起始界限,例如 (0..3).starts_at() == 0(..3_u8).starts_at() == 0
  • ends_at(&self) -> T:包含结束边界,例如 (0..3).ends_at() == 2(0..=2).ends_at() == 2(..=2).ends_at() == 2,...

以下方法具有默认实现(可能不需要更改)

  • includes(&self, &T) -> bool:来自标准库的 .contains(&T)RangeBounds<T>,但使用 starts_at()ends_at() 实现
  • intersects(&self, other: &impl RangeUtil<T>) -> bool:两个范围是否相交,例如 0..=22..3 是相交的,而 0..22..3 则不相交
  • intersection(&self, other: &impl RangeUtil<T>) -> Option<RangeInclusive<T>>:返回两个范围集合的交集,结果为包含范围,例如:(0..=3).intersects(&(1..)) == Some(1..=3)
  • setminus(&self, other: &impl RangeUtil<T>) -> (Option<RangeInclusive<T>>, Option<RangeInclusive<T>>):从集合 self 中去除 other 中的元素,例如:(..100u8).setminus(&(50..)) == (Some(0..=50), None),或者:(..100u8).setminus(&(25..75)) == (Some(0..=24), Some(75..=99))

无运行时依赖