#comparison #expressions #fluent #dry #multi

no-std fluent-comparisons

通过编写类似于 if any_of!({a,b,c}>=5) {...} 的多比较表达式来提高可读性,同时保留手动编写代码的优点

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日

191Rust 模式

Download history 403/week @ 2024-07-22 44/week @ 2024-07-29

每月 447 次下载

MIT 许可证

56KB
949

fluent-comparisons

build tests lints maintenance-status

多比较的流畅语法。

如果你曾经因为编写重复的条件而感到烦恼,并希望能用更具有表现力和重复性更低的代码来替换它,那么这个库就是为你准备的

if x < a && y < a && z < a {
    // ... do something
}

现在你可以将代码重写为

use fluent_comparisons::all_of;
if all_of!({x,y,z} < a) {
    // ... do something
}

支持

如果你喜欢这个库,请向其他人推荐它。如果你愿意,你也可以 买我一杯咖啡

示例

该库提供了宏 any_ofall_ofnone_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_ofnone_of 宏也是如此。更多信息请查看文档。

这个库受到了Björn Fahller的DRY comparisons Modern C++库的启发,我在Jonathon Boccara的博客上的一篇博客文章中了解到它。

依赖关系