5 个版本 (破坏性更新)
0.5.0 | 2022 年 8 月 21 日 |
---|---|
0.4.0 | 2022 年 8 月 2 日 |
0.3.0 | 2021 年 1 月 5 日 |
0.2.0 | 2021 年 1 月 3 日 |
0.1.0 | 2021 年 1 月 3 日 |
#21 在 #predicate
14KB
340 行
refinement
方便创建类型安全的精炼类型。
安装
查看 cargo 包
文档
查看 docs.rs
lib.rs
:
方便创建类型安全的精炼类型。
该 crate 试图捕捉精炼类型的概念,精炼类型是一种赋予谓词的类型,假设该谓词对精炼类型的任何元素都成立。^1
当运行时只期望类型的一定值时,精炼类型非常有用。例如,假设有一个只对偶数进行逻辑处理的函数。
fn takes_even(i: i32) {
if i % 2 == 0 {
println!("Received even number {}", i);
} else {
panic!("Received odd number");
}
}
takes_even(1); // oops
使用精炼类型,这个函数可以定义得不可能提供奇数。
use refinement::{Refinement, Predicate};
struct Even;
impl Predicate<i32> for Even {
fn test(x: &i32) -> bool {
*x % 2 == 0
}
}
type EvenInt = Refinement<i32, Even>;
fn takes_even(i: EvenInt) {
println!("Received even number {}", i);
}
match EvenInt::new(4) {
Some(x) => takes_even(x), // "Received even number 4"
None => { /* ... */ } // Handle logical error
}