2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2019年12月1日 |
---|---|
0.1.0 | 2016年2月18日 |
#745 in Rust模式
1,643 每月下载量
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());