我正在尝试实现一个泛型函数linspace:
pub fn linspace<T> (x0: T, xend: T, n: usize) -> Vec<T>
where
T: Sub<Output = T>
+ Add<Output = T>
+ Div<Output = T>
+ Clone
{
let dx = (xend - x0) / ((n - 1) as T);
let mut x = vec![x0; n];
for i in 1..n {
x[i] = x[i - 1] + dx;
}
x
}
到目前为止,我已经了解到T
必须实现Sub
、Add
、Div
和Clone
,但现在我遇到了n as T
语句的问题。
non-primitive cast: `usize` as `T`
let dx = (xend - x0) / ((n - 1) as T);
| ^^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object
我知道num板条箱,但我试图实现这一点没有外部板条箱。有一个变通办法吗?谢谢!
3条答案
按热度按时间k2fxgqgv1#
除非您将此作为一个学习练习,否则我建议您使用
num_traits
crate中的边界,它具有Float
这样的特性,在这里会很有用:然而现在我得到的错误:没有为“f64”实现特征“From”。
它未实现,因为存在无法精确表示为
f64
的usize
值。该错误会让您决定如何处理这些值。如果遇到这样的值,我的代码会出现混乱。此外,我相信浮点加法会累积错误,因此基于乘法的计算可能是更好的主意:
Playground
7z5jn7bk2#
如果您想坚持使用标准库特性,您将需要使用
TryInto
,并处理这样一个事实,即由于数字类型可能小于输入,所请求的转换可能会失败。因此,我们必须使项的数目为u16
,它可以转换为任何浮点类型。如果给定的
n
太大,例如T
为u8
,n
为1000
,则会出现混乱。(By重复添加
dx
的方式通常不是最好的方式,因为如果T
是浮点类型,则它会累积错误;最后一个元素将不必等于xend
。t3psigkw3#
这样更简洁: