5 个版本
0.2.2 | 2020年2月28日 |
---|---|
0.2.1 | 2020年2月25日 |
0.1.2 | 2020年2月22日 |
0.1.1 | 2020年2月22日 |
0.1.0 | 2020年2月22日 |
1588 在 数据结构
18KB
221 行
cmp_wrap
你是否曾经需要根据上下文比较相同的数据的不同字段?如果是这样,这个 crate 就是为你准备的!
这个 crate 的主要功能是围绕类型的一个轻量级包装器,它允许你在映射(键化)函数之后比较它们,这意味着部分 cmp 操作符(<, >, == ...)被应用于键化函数的结果。
这个 crate 中有两个主要模块:[permissive] 和 [strict]。宽松的模块允许你在键化函数返回可比较类型的情况下比较不同类型。
严格的实现不会允许你比较不同类型,并将你从不同的上下文比较中拯救出来。
示例
使用上下文
你可能有一些上下文,你会在其中比较你的值,比如向量的长度或第一个值。
use cmp_wrap::permissive::KeyCmpContext;
let by_length = KeyCmpContext::new(|v: &Vec<_>| v.len());
let long_vec = by_length.wrap(vec![1,2,3,4]);
let short_vec = by_length.wrap(vec![1,2]);
assert!(long_vec > short_vec, "The vec {:?} is longer then {:?}", long_vec, short_vec);
可能会为相同的数据使用多个上下文
use cmp_wrap::strict::KeyCmpContext;
let long_vec = vec![1,2,3,4];
let short_vec = vec![4,2];
let by_length = KeyCmpContext::new(|v: &&Vec<_>| v.len());
let by_first_element = KeyCmpContext::new(|v: &&Vec<_>| v[0]);
let by_length_long = by_length.wrap(&long_vec);
let by_length_short = by_length.wrap(&short_vec);
let by_first_element_long = by_first_element.wrap(&long_vec);
let by_first_element_short = by_first_element.wrap(&short_vec);
assert!(by_length_long > by_length_short,
"The vec {:?} is longer then {:?}", long_vec, short_vec);
assert!(by_first_element_long < by_first_element_short,
"The vec's {:?} first element is smaller then {:?}'s", long_vec, short_vec);
通过直接创建
你可以在“逐个案例”的基础上定义键函数。这不被推荐。
use cmp_wrap::permissive::CmpByKey;
let len_as_key = |v: &Vec<_>| v.len();
let long_vec = CmpByKey::new(vec![1,2,3,4], &len_as_key);
let short_vec = CmpByKey::new(vec![1,2], &len_as_key);
assert!(long_vec > short_vec, "The vector {:?} is longer then {:?}", long_vec, short_vec);
许可证:MIT