我正在开发一个库,它将为轴对齐边界框(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;
这很有效,但每次我需要一个特定的数字时我都需要求助于它,而且它变得很麻烦。这真的是唯一的方法吗?
答案 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
方法,或者在域中有意义的其他方法。
另见: