Generics 具有多个类型的边界

Generics 具有多个类型的边界,generics,rust,Generics,Rust,目前我有以下功能: fn out\u cubic(t:f32,开始:f32,更改:f32,持续时间:f32)->f32{ 返回更改*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始; } 我试图使begin和change参数都成为泛型类型。据我所知,我可以使用Rust的界限对编译器说change和begin应该实现加法和乘法操作: 使用std::ops:{Add,Mul}; fn out_cubic(t:f32,begin:t,change:t,duration:f32

目前我有以下功能:

fn out\u cubic(t:f32,开始:f32,更改:f32,持续时间:f32)->f32{
返回更改*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始;
}
我试图使
begin
change
参数都成为泛型类型。据我所知,我可以使用Rust的界限对编译器说
change
begin
应该实现加法和乘法操作:

使用std::ops:{Add,Mul};
fn out_cubic(t:f32,begin:t,change:t,duration:f32)->t{
返回更改*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始;
}
但上面的代码显示以下错误:

错误[E0308]:类型不匹配
-->src/rs:44:21
|
43 | fn out_cubic(t:f32,begin:t,change:t,duration:f32)->t{
|-此类型参数
44 |返回变化*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始;
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:应为类型参数`T`
找到类型'f32`
错误[E0369]:无法将“T”添加到“::输出`
-->src/rs:44:66
|
44 |返回变化*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始;
|--------------------------------------------------------------^-----T
|            |
|::输出
这是有意义的,编译器没有任何方法知道类型
T
应该能够与
f32
类型相加和相乘

我的问题是,是否可以创建一个函数,该函数同时实现
T
f32
类型的加法和乘法操作?类似于这样:

fn out_cubic(t:f32,begin:t,change:t,duration:f32)->t{
返回更改*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始;
}

既然您正在添加
f32+T
,实际上需要断言
f32
Add

fn out_cubic(t:f32,begin:t,change:t,duration:f32)->t
哪里
T:Add+Mul,//断言输出是T
f32:Add+Add,//无论出于何种原因,f32到f32的添加都需要“+Add”
{
返回更改*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始;
}
当然,您可以通过只声明它必须对其输出进行操作来使其更通用,但它开始变得混乱:

fn out_cubic(t:f32,begin:t,change:t,duration:f32)->:输出
哪里
T:Mul,
::输出:添加,
f32:添加+添加,
{
返回更改*(f32::powf((t/持续时间)-1.0,3.0)+1.0)+开始;
}

< /代码>您想支持哪种类型?尝试支持任意类型可能会导致不必要的复杂,并且调用“<代码> f32::POFF < /C>”和“常数”如1或3会出现问题。如果您只想将整数发送到函数,也许您应该考虑<代码> T:绑定到< /代码>中。>?@user4815162342,我正在尝试支持
f32
和向量(
Vec2
Vec3
,等等).我明白你的观点,代码可能会变得复杂,也许更简单的方法更利于代码的可读性,但我也很好奇如何实现这种通用情况。你的答案是正确的,但看到我的实现我不需要(也不支持)add操作
T+f32
,因此从第一个代码段中删除
f32:add+add,
是正确的。我想知道“无论出于何种原因,
+add
对于f32到f32的添加是否是必要的”应该作为潜在的编译器问题报告吗?必须指定一个绑定的特性才能在支持它的具体类型上进行添加,这很奇怪。