【发布时间】:2022-11-03 02:20:29
【问题描述】:
我正在尝试实现一个通用函数 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 crate,但我试图在没有外部 crate 的情况下实现这一点。有解决方法吗? 谢谢!
【问题讨论】:
-
要从
usize转换为T,请查看From之类的标准转换特征(或更可能是TryFrom,因为从usize转换为大多数其他整数类型是错误的) -
谢谢,@kmdreko 的回答。我在特征绑定中添加了
From<usize>,并使用T::from(n - 1)实现了转换(以避免错误处理,因为它需要TryFrom),但现在我收到错误:the trait 'From<usize>' is not implemented for 'f64'。有什么建议,请。