generics - 具有多种类型的边界
问题描述
目前我有以下防锈功能:
fn out_cubic(t: f32, begin: f32, change: f32, duration: f32) -> f32 {
return change * (f32::powf((t / duration) - 1.0, 3.0) + 1.0) + begin;
}
我正在尝试同时创建begin
和change
参数泛型类型。据我了解,我可以使用 Rust 的边界对编译器说change
并且begin
应该实现加法和乘法操作:
use std::ops::{Add, Mul};
fn out_cubic<T: Add + Mul>(t: f32, begin: T, change: T, duration: f32) -> T {
return change * (f32::powf((t / duration) - 1.0, 3.0) + 1.0) + begin;
}
但上面的代码显示以下错误:
error[E0308]: mismatched types
--> src/easing.rs:44:21
|
43 | fn out_cubic<T: Add + Mul>(t: f32, begin: T, change: T, duration: f32) -> T {
| - this type parameter
44 | return change * (f32::powf((t / duration) - 1.0, 3.0) + 1.0) + begin;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter `T`, found `f32`
|
= note: expected type parameter `T`
found type `f32`
error[E0369]: cannot add `T` to `<T as Mul>::Output`
--> src/easing.rs:44:66
|
44 | return change * (f32::powf((t / duration) - 1.0, 3.0) + 1.0) + begin;
| ----------------------------------------------------- ^ ----- T
| |
| <T as Mul>::Output
这是有道理的,编译器没有任何方法知道该类型T
应该能够与f32
类型相加和相乘。
我的问题是,是否可以创建一个函数来实现加法和乘法运算T
以及f32
类型?像这样的东西:
fn out_cubic<T: Add<T> + Add<f32> + Mul<T> + Mul<f32>>(t: f32, begin: T, change: T, duration: f32) -> T {
return change * (f32::powf((t / duration) - 1.0, 3.0) + 1.0) + begin;
}
解决方案
由于您要添加,因此您实际上f32 + T
需要断言:f32
Add<T>
fn out_cubic<T>(t: f32, begin: T, change: T, duration: f32) -> T
where
T: Add<T, Output = T> + Mul<f32, Output = T>, // assert that Output is T
f32: Add<T> + Add, // the `+ Add` is necessary for f32 to f32 addition for whatever reason
{
return change * (f32::powf((t / duration) - 1.0, 3.0) + 1.0) + begin;
}
当然,您可以通过仅断言它必须对其输出进行操作来使其更加通用,但它开始变得混乱:
fn out_cubic<T>(t: f32, begin: T, change: T, duration: f32) -> <<T as Mul<f32>>::Output as Add<T>>::Output
where
T: Mul<f32>,
<T as Mul<f32>>::Output: Add<T>,
f32: Add<T> + Add,
{
return change * (f32::powf((t / duration) - 1.0, 3.0) + 1.0) + begin;
}
推荐阅读
- javascript - 通过关联适当使用
- c# - 无法打开程序集“路径”:没有这样的文件或目录——Monogame 默认游戏没有运行?
- json - 我的 manifest.json 文件包含一个我找不到的错误
- python - 如何为特定的解释器获取 PYTHONHOME?
- excel - 可以返回对象和标量的 vba 函数
- html - 将 HTML 中的用户输入放入链接(使用 APIS)(JSON + AJAX + HTML)
- r - 将函数重命名为 r 上的列表时出错
- python - TypeError: unhashable type: 'dict' in Networkx 随机游走代码,以前可以工作
- python - Python混合全局变量和局部变量?
- javascript - Chrome DevTools 的颜色选择器如何根据输入的 RGB 颜色计算光标位置?