如何为通用数字类型创建特定值?

时间:2016-08-18 20:12:49

标签: rust

我正在开发一个库,它将为轴对齐边界框(AABB)操作提供特征。特征声明如下:

trait Aabb {
    type Precision : Zero + One + Num + PartialOrd + Copy;
    // [...]
}

我不关心用户选择的精度,只要这些约束得到尊重(尽管我并不真的希望选择整数类型)。

我在使用文字方面遇到了麻烦。有些操作需要常量值,例如:

let extension = 0.1;
aabb.extend(extension);

这不起作用,因为Aabb::extend期望Aabb::Precision而不是浮点数。我的解决方案是这样的:

let mut ten = Aabb::Precision::zero();
for _ in 0..10 {
    ten = ten + Aabb::Precision::one();
}

aabb_extension = Aabb::Precision::one() / ten;

这很有效,但每次我需要一个特定的数字时我都需要求助于它,而且它变得很麻烦。这真的是唯一的方法吗?

2 个答案:

答案 0 :(得分:1)

在这种情况下,我建议您创建自己的特征并提供方法的默认实现。

例如,我会天真地想象:

trait ApproximateValue: Zero + One {
    fn approximate(val: f64) -> ApproximateValue {
        // some algorithm to create "val" from Zero and One
    }
}

然后,您的Precision关联类型的界限为ApproximateValue,您只需拨打Precision::approximate(0.1)

答案 1 :(得分:1)

  

每次我需要一个特定的数字时,我都需要求助于此,而且它变得很麻烦。这真的是唯一的方法吗?

基本上,是的。除非您可以回答“您如何支持将文字0转换为MyCustomTypeThatImplementsTheTrait”的问题。

你不可能两种方式 - 你不能要求某些东西是通用的,然后使用具体的文字。

您可以有不同的解决方法。例如,提供诸如“零”和“一”之类的基本值,或者具有“将特定类型转换为自己”方法。

您还可以重新评估您尝试做的事情;也许你的想法太低了。实际上,“延伸0.1”是指将点表示为0到1之间的浮点值的类型是什么意思?

或许最好使用expand_by_percentage方法,或者在域中有意义的其他方法。

另见: