#ord #expression #traits #key #logic #inline #reverse

ord_by_key

提供了一个方便的宏,用于使用内联表达式指定的逻辑实现Ord特性

2个版本

0.1.3 2020年11月17日
0.1.2 2020年11月17日
0.1.1 2020年11月16日
0.1.0 2020年11月16日

#1450 in 过程宏

每月 24 次下载

MIT/Apache

18KB
133

ord_by_key

提供了一个方便的宏,用于使用内联表达式指定的逻辑实现Ord特性

use core::cmp::Reverse;
// `Person` will be ordered by `last_name`, then by 
// `first_name`, then by `age` in reverse
#[ord_eq_by_key_selector(|p|
    &p.last_name,
    &p.first_name,
    Reverse(p.age),)]
pub struct Person {
    pub first_name: String,
    pub last_name: String,
    pub age: usize,
}
// Container for `&str` which will be ordered by underlying
// string length
#[ord_eq_by_key_selector(|(s)| s.len())]
pub struct StrByLen<'a>(&'a str);

assert!(StrByLen("Alex") > StrByLen("Bob"));

no_std 支持

ord_by_key 应该与 no_std 兼容,但未进行测试。

许可证

在MIT许可证和Apache许可证(版本2.0)的条款下分发


lib.rs:

提供了一个方便的宏,用于使用内联表达式指定的逻辑实现Ord特性

use ord_by_key::ord_eq_by_key_selector;
use core::cmp::Reverse;
// `Person` will be ordered by `last_name`, then by `first_name`, then by `age` in reverse
#[ord_eq_by_key_selector(|p|
    &p.last_name,
    &p.first_name,
    Reverse(p.age),)]
pub struct Person {
    pub first_name: String,
    pub last_name: String,
    pub age: usize,
}
use ord_by_key::ord_eq_by_key_selector;
// Container for [`&str`] which will be ordered by underlying string length
#[ord_eq_by_key_selector(|(s)| s.len())]
pub struct StrByLen<'a> (&'a str);

// Note, comparison happens just based on string length
assert!(StrByLen("Alex") > StrByLen("Bob"));
assert!(StrByLen("Alex") == StrByLen("John"));
assert!(StrByLen("Alex") < StrByLen("Michael"));

依赖项

~1.5MB
~35K SLoC