我可以使用什么特性进行数值类型的“模糊比较”?

时间:2014-12-18 11:57:39

标签: rust

我试图写一个"模糊比较"在Rust中的功能。

以下是一个例子:

fn fuzzy_cmp(a: f64, b: f64, tolerance: f64) -> bool {
    a >= b - tolerance && a <= b + tolerance
}

我在将其转换为通用版本时遇到问题。是否存在对自然点和浮点数进行分组的特征,同时允许对它们执行算术运算?像这样:

fn fuzzy_cmp<T: Numbers>(a: T, b: T, tolerance: T) -> bool {
    a >= b - tolerance && a <= b + tolerance
}

我想在以下情况下使用此功能:

fuzzy_cmp(x, 20u64, 5u64)
fuzzy_cmp(y, 20f64, 5f64)
// ... etc

我已经尝试了Ord特质,但它不起作用:

28:23 error: binary operation `-` cannot be applied to type `T`
a >= b - tolerance && a <= b + tolerance
     ^~~~~~~~~~~~~

Trait core::num::Num似乎已被弃用,所以我甚至都没有尝试使用它。

1 个答案:

答案 0 :(得分:5)

您不需要指定T应该是内置数字类型,只需要它必须支持公式所需的加法,减法和比较特征:

fn fuzzy_cmp<T: Add<T, T> + Sub<T, T> + PartialOrd>(a: T, b: T, tolerance: T) -> bool {
    a >= b - tolerance && a <= b + tolerance
}