#arithmetic-operations #arithmetic #operations #ord #cmp #options

no-std option-operations

为处理Option时提高算术操作可用性的特性和自动实现

6个版本 (破坏性)

0.5.0 2022年8月15日
0.4.1 2022年6月29日
0.4.0 2021年10月24日
0.3.0 2021年10月18日
0.1.0 2021年10月7日

#326 in 数学

Download history 13854/week @ 2024-03-14 14536/week @ 2024-03-21 13687/week @ 2024-03-28 13401/week @ 2024-04-04 14433/week @ 2024-04-11 14110/week @ 2024-04-18 13219/week @ 2024-04-25 13708/week @ 2024-05-02 13830/week @ 2024-05-09 14361/week @ 2024-05-16 14033/week @ 2024-05-23 13079/week @ 2024-05-30 12608/week @ 2024-06-06 14637/week @ 2024-06-13 13911/week @ 2024-06-20 11658/week @ 2024-06-27

每月 55,000 次下载
130 个Crate中使用(通过 gstreamer

MIT/Apache

110KB
2.5K SLoC

option-operations

crates.io Documentation Build Status MSRV

option-operations提供了特性和自动实现,以提高处理Option时的算术操作可用性。

示例

处理两个Option可能会导致冗长的表达式

let lhs = Some(1u64);
let rhs = Some(u64::MAX);

assert_eq!(
    lhs.zip(rhs).map(|(lhs, rhs)| lhs.saturating_add(rhs)),
    Some(u64::MAX),
);

得益于特OptionSaturatingAdd,我们可以写出

assert_eq!(
    lhs.opt_saturating_add(rhs),
    Some(u64::MAX),
);

该特性也可以与内部类型一起使用

assert_eq!(
    lhs.opt_saturating_add(u64::MAX),
    Some(u64::MAX),
);

assert_eq!(
    1.opt_saturating_add(rhs),
    Some(u64::MAX),
);

针对Option<T>PartialOrd的替代方案

另一个目的是解决Option<T>PartiaOrd实现问题,该实现使用Option变体的声明顺序。当None出现在Some(_)之前时,它会产生以下行为

let some_0 = Some(0);
let none: Option<u64> = None;

assert_eq!(none.partial_cmp(&some_0), Some(Ordering::Less));
assert_eq!(some_0.partial_cmp(&none), Some(Ordering::Greater));

在某些情况下,我们可能会认为None反映的是一个未定义的值,因此不能与Some(_)进行比较。

assert_eq!(none.opt_cmp(&some_0), None);
assert_eq!(some_0.opt_cmp(&none), None);

当然,这与其他常见的比较一致

assert_eq!(none.opt_lt(&some_0), None);
assert_eq!(none.opt_min(&some_0), None);

许可证

此Crate受以下之一的许可证约束

任选其一。

依赖项