Rust 如何为泛型数字类型创建特定值?

Rust 如何为泛型数字类型创建特定值?,rust,Rust,我正在开发一个库,它将为轴对齐边界框(AABB)操作提供特性。特性声明如下: trait Aabb { type Precision : Zero + One + Num + PartialOrd + Copy; // [...] } let mut ten = Aabb::Precision::zero(); for _ in 0..10 { ten = ten + Aabb::Precision::one(); } aabb_extension = Aabb::P

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

trait Aabb {
    type Precision : Zero + One + Num + PartialOrd + Copy;
    // [...]
}
let mut ten = Aabb::Precision::zero();
for _ in 0..10 {
    ten = ten + Aabb::Precision::one();
}

aabb_extension = Aabb::Precision::one() / ten;
我不在乎用户选择哪种精度,只要这些约束得到尊重(尽管我并不期望选择整数类型)

我在使用文字方面有困难。某些操作需要常量值,例如:

let extension = 0.1;
aabb.extend(extension);
这不起作用,因为
Aabb::extend
需要
Aabb::Precision
而不是float。我的解决方案是这样的:

trait Aabb {
    type Precision : Zero + One + Num + PartialOrd + Copy;
    // [...]
}
let mut ten = Aabb::Precision::zero();
for _ in 0..10 {
    ten = ten + Aabb::Precision::one();
}

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

这是可行的,但每次我需要一个特定的数字时,我都需要使用它,这会变得很麻烦。这真的是唯一的方法吗?

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

例如,我会天真地想象:

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

然后,您的
Precision
关联类型将有一个
ApproximateValue
的边界,您只需调用
Precision::approximate(0.1)
在这种情况下,我建议您创建自己的trait并提供方法的默认实现

例如,我会天真地想象:

trait ApproximateValue: Zero + One {
    fn approximate(val: f64) -> ApproximateValue {
        // some algorithm to create "val" from Zero and One
    }
}
然后,您的
Precision
关联类型将有一个
ApproximateValue
的边界,您只需调用
Precision::approximate(0.1)

每当我需要一个特定的号码时,我都需要求助于此,这变得越来越麻烦。这真的是唯一的办法吗

基本上,是的。除非您能回答“如何支持将文字
0
转换为实现该特性的
MyCustomType”的问题

你不能两全其美——你不能要求某些东西是通用的,然后使用具体的文字

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

你也可以重新评估你正在尝试做什么;也许你的思维水平太低了。实际上,“扩展0.1”一种将点表示为介于0和1之间的浮点值的类型意味着什么

也许最好使用
expand\u by\u percentage
方法,或者其他在域中有意义的方法


另见:

每当我需要一个特定的号码时,我都需要求助于此,这变得越来越麻烦。这真的是唯一的办法吗

基本上,是的。除非您能回答“如何支持将文字
0
转换为实现该特性的
MyCustomType”的问题

你不能两全其美——你不能要求某些东西是通用的,然后使用具体的文字

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

你也可以重新评估你正在尝试做什么;也许你的思维水平太低了。实际上,“扩展0.1”一种将点表示为介于0和1之间的浮点值的类型意味着什么

也许最好使用
expand\u by\u percentage
方法,或者其他在域中有意义的方法


另见:


我无法编译它,它在
近似值的返回中说
缺少相关类型的“输出”值
,将其更改为
近似值>
只会将错误向前推。@LukeB.:在我提出的代码中没有
输出
并且
近似值
没有相关类型。。。因此,我需要查看您的代码以了解发生了什么(例如,您可以使用Rust playpen或要点)。我只是复制并粘贴了您的代码(并添加了一个
未实现!()
调用)。我试着在操场上粘贴你的代码,但也无法在操场上编译,尽管错误不同
特征'ApproximateValue'无法生成对象
我无法编译,它在
approximate
的返回中说
缺少相关的类型'Output'值
,将其更改为
近似值>
只会将错误向前推。@LukeB.:在我提出的代码中没有
输出
近似值
没有关联的类型。。。因此,我需要查看您的代码以了解发生了什么(例如,您可以使用Rust playpen或要点)。我只是复制并粘贴了您的代码(并添加了一个
未实现!()
调用)。我试着在操场上粘贴你的代码,但也无法在操场上编译,尽管错误不同
特征'ApproximateValue'不能成为一个对象
我扩展了一个任意值,因为算法需要最小大小的AABBs,
0.1
只有在使用类似于
0.0001
的东西表示仪表时才是不好的。但是,您将遇到比未优化的树更多的问题。无论如何,谢谢你的回答,我将坚持手工构建值。@LukeB。如果您允许传递泛型类型,那么您不能对该类型如何实现该特性或哪些类型的值会被该类型很好地优化做出全面声明。您能给我一个可能出错的示例吗?如果你没有正确地实现这个特性,它是不会起作用的,但是我真的不能为我的代码辩护,可以吗?除非你是说有人使用像i32而不是f32这样的东西?如果你可能是对的,我还没有用整数测试我的代码,所以我不知道它会如何反应。我扩展了一个任意值,因为算法需要最小大小的AABB,
0.1
只有当你用
0.0001
来表示一个米时才是坏的。但是,然后,你会跑