11 个版本 (5 个稳定)
1.0.4 | 2024年7月27日 |
---|---|
1.0.3 | 2024年7月24日 |
1.0.1 | 2023年10月17日 |
0.3.1 | 2021年4月26日 |
0.1.1 | 2021年4月18日 |
191 在 Rust 模式 中
每月 447 次下载
56KB
949 行
fluent-comparisons
多比较的流畅语法。
如果你曾经因为编写重复的条件而感到烦恼,并希望能用更具有表现力和重复性更低的代码来替换它,那么这个库就是为你准备的
if x < a && y < a && z < a {
// ... do something
}
现在你可以将代码重写为
use fluent_comparisons::all_of;
if all_of!({x,y,z} < a) {
// ... do something
}
支持
如果你喜欢这个库,请向其他人推荐它。如果你愿意,你也可以 买我一杯咖啡。
示例
该库提供了宏 any_of
、all_of
和 none_of
,以简化编写表达式的多比较。参数不需要是数字,可以是任何类型的表达式。此外,还提供了应用于左侧集合的转换和谓词的语法。
// the following assertions hold
assert!(none_of!({1,2,3}>4));
assert!(any_of!({1,2,3}.map(|x|x%2)==0));
assert!(all_of!({2,5,7}.satisfy(is_prime_number)));
简要描述和主要优点
除了提供直观的语法外,这些宏编译成的汇编代码与手动编写的代码相同(在 godbolt.org 上查看)。另一个好处是,从左到右进行延迟求值,如下面的代码片段所示
use fluent_comparisons::any_of;
// if cheap_calc(arg1) <=5, then the expensive calculation
// is never performed
let b = any_of!({cheap_calc(arg1), expensive_calc(arg2)}<=5);
// whereas if we did the following, the expensive calculation would be
// performed regardless of the result of cheap_calc(arg1)
let b = [cheap_calc(arg1), expensive_calc(arg2)].iter().any(|val|val<=&5);
最后,你可以放心,这个库经过了充分的测试。
用法
通过编写 any_of!({/*表达式列表*/} 操作符 右边表达式)
来使用宏,其中操作符可以是任何二元比较运算符,例如 ==
、!=
、<=
、<
、>
和 >=
。左边表达式列表使用逗号分隔。比较的右边也是一个表达式。
表达式列表可以有可变数量的元素,但至少必须有一个。它必须始终用花括号括起来。左边的表达式不必是同一类型,但与右边表达式的比较必须单独有效。此外,表达式可以评估为可以与 rhs
比较的任何内容,而不仅仅是数字。
对于 all_of
和 none_of
宏也是如此。更多信息请查看文档。
链接
这个库受到了Björn Fahller的DRY comparisons Modern C++库的启发,我在Jonathon Boccara的博客上的一篇博客文章中了解到它。