#range #early #bounds #checking #helper #value #outside

range_check

带有边界检查和范围辅助函数的Rust库

2个不稳定版本

使用旧的Rust 2015

0.2.0 2019年12月1日
0.1.0 2016年2月18日

#745 in Rust模式

Download history 260/week @ 2023-12-05 496/week @ 2023-12-12 304/week @ 2023-12-19 119/week @ 2023-12-26 147/week @ 2024-01-02 320/week @ 2024-01-09 192/week @ 2024-01-16 209/week @ 2024-01-23 118/week @ 2024-01-30 234/week @ 2024-02-06 300/week @ 2024-02-13 369/week @ 2024-02-20 515/week @ 2024-02-27 519/week @ 2024-03-05 368/week @ 2024-03-12 200/week @ 2024-03-19

1,643 每月下载量

MIT 许可证

13KB
108

rust-range-check 构建状态

这是一个用于早期返回范围和边界检查的小型库。它与Rust的标准Range类型一起工作。

查看Rustdoc

安装

这个crate与Cargo一起工作。将以下内容添加到你的Cargo.toml依赖关系部分

[dependencies]
range_check = "0.2"

稳定性

这个crate需要collections_range特性,该特性在Rust 1.28.0中稳定。

示例

stdlib中的范围检查

Rust的标准库允许你测试一个范围是否包含指定的值

// Range checking with std::ops
assert_eq!((0..24).contains(&23), true);
assert_eq!((0..24).contains(&24), false);

有关更多信息,请参阅官方Rust文档中的std::ops::RangeBounds

使用此crate进行范围检查

range_check crate提供了一个具有check_range函数的Check特质,该函数返回一个Result而不是一个bool

如果值在范围内,它将以Ok变体返回值

use range_check::Check;

assert_eq!(24680.check_range(1..99999),
           Ok(24680));

如果值不在范围内,它将返回一个包含在OutOfRangeError错误变体中的值

use range_check::Check;

assert_eq!(24680.check_range(1..9999).unwrap_err().to_string(),
           "value (24680) outside of range (1..9999)");

如果值超出范围则提前失败

在测试多个值时,如果其中一个值超出范围,有时自动返回是有帮助的。

在这个例子中,我们使用?运算符来提前返回

use range_check::{Check, OutOfRangeError};

struct Clock {
    hour: i8,
    minute: i8,
}

impl Clock {
    fn new(hour: i8, minute: i8) -> Result<Clock, OutOfRangeError<i8>> {
        Ok(Clock {
            hour: hour.check_range(0..24)?,
            minute: minute.check_range(0..60)?,
        })
    }
}

assert!(Clock::new(23, 59).is_ok());
assert!(Clock::new(23, 60).is_err());
assert!(Clock::new(24, 00).is_err());

当测试的值具有不同类型时,这会成为一个问题,因为函数的Result只能有一个类型作为错误。

只要可以使用 From 特性进行类型转换,您就可以使用 OutOfRangeError::generify 函数来转换错误。在这个示例的第一个调用中,我们将错误从包含 i8 转换为 i16

use range_check::{Check, OutOfRangeError};

struct Clock {
    second: i8,
    millisecond: i16,
}

impl Clock {
    fn new(second: i8, millisecond: i16) -> Result<Clock, OutOfRangeError<i16>> {
        Ok(Clock {
            second: second.check_range(0..60).map_err(OutOfRangeError::generify)?,
            millisecond: millisecond.check_range(0..1000)?,
        })
    }
}

assert!(Clock::new(45, 576).is_ok());
assert!(Clock::new(49, 23456).is_err());
assert!(Clock::new(61, 0).is_err());

无运行时依赖