Теперь я хочу написать набор общих математических функций для массива f64 \ f32 \ i32 \ i64
Некоторые функции просты в написании, например, функции сложения:
pub fn add_val<T: std::ops::Add<Output=T> + Copy>(val1: &[T; 2], val2: &[T; 2]) -> [T; 2]{
[val1[0] + val2[0], val1[1] + val2[1]]
}
Но я столкнулся с некоторыми проблемами при реализации некоторых функций. Например, есть функция нормализации:
pub fn normalize(val: &[f64; 2], len: &f64) -> [f64; 2] {
let real_length = (val[0] * val[0] + val[1] * val[1]).sqrt();
if real_length == 0.0 { // fix: NaN when 0
return [val[0], val[1]]
} else {
let scale = len / real_length;
[val[0] * scale, val[1] * scale]
}
}
это легко понять , Теперь я хочу, чтобы она поддерживала больше типов данных.
Одна из моих попыток:
pub fn normalize<T: std::ops::Add<Output=T> + std::ops::Mul<Output=T> + std::ops::Div<Output=T> + std::convert::From<f32> + std::convert::Into<f32> + Copy + std::cmp::PartialEq>(val: &[T; 2], len: &T) -> [T; 2] {
let pow_num: f32 = (val[0] * val[0] + val[1] * val[1]).into();
let real_length: f32 = (pow_num).sqrt();
if real_length == 0.0 { // fix: 不特判 0 可能会返回 NaN
return [val[0], val[1]]
} else {
let scale = *len / T::from(real_length);
[val[0] * scale, val[1] * scale]
}
}
Это ошибка:
58 | let c = normalize(&a, &3.0);
| ^^^^^^^^^ the trait `std::convert::From<f64>` is not implemented for `f32`
|
= help: the following implementations were found:
<f32 as std::convert::From<i16>>
<f32 as std::convert::From<i8>>
<f32 as std::convert::From<u16>>
<f32 as std::convert::From<u8>>
= note: required because of the requirements on
Причина 1018 * для этой ошибки
Я также пытаюсь использовать as
Но мне сказали, что только можнобыть использованным в примитивном типе。
Я обнаружил, что примитивная черта была удалена , поэтому я не знаю, как ее квалифицировать ...
Если у вас есть хорошие идеиЯ надеюсь, что вы можете поделиться со мной, большое спасибо.