在 Rust 中,为泛型类型实现特征的正确方法是什么?我希望我的 Vector 由整数或浮点数组成。不管我想要 get_magnitude() 输出 f64 的类型。如何让 powi() 和 sqrt() 工作?任何解决方法?我卡住了
pub struct Vector<T> {
i: T,
j: T,
k: T,
}
impl<T> Vector<T> {
fn new(i: T, j: T, k: T) -> Vector<T> {
Vector {
i,
j,
k,
}
}
}
impl<T> Vector<T> {
fn get_magnitude(&self) -> f64 {
(self.i.powi(2) + self.j.powi(2) + self.k.powi(2)).sqrt()
}
}
[https://www.codewars.com/kata/58ee4962dc4f81d6f400001c/rust][1]
答案 0 :(得分:2)
您可以将 get_magnitide()
限制为仅在 T
适用时才起作用。而不是限制 T
具有 powi()
,我建议您最初将它们转换为 f64
并从那里进行数学计算。
您可以使用 AsPrimitive<f64>
板条箱中的 num 特性:
use num::cast::AsPrimitive; // 0.4.0
pub struct Vector<T> {
i: T,
j: T,
k: T,
}
impl<T> Vector<T> {
fn new(i: T, j: T, k: T) -> Vector<T> {
Vector { i, j, k }
}
}
impl<T> Vector<T> {
fn get_magnitude(&self) -> f64
where
T: AsPrimitive<f64>,
{
(self.i.as_().powi(2) + self.j.as_().powi(2) + self.k.as_().powi(2)).sqrt()
}
}
您还可以通过 Num
trait 限制整个 Vector
结构仅在 T
是数字时才起作用:
use num::Num; // 0.4.0
pub struct Vector<T>
where
T: Num
{
i: T,
j: T,
k: T,
}
但是您仍然需要对 get_magnitude()
的约束,因为您要强制它返回 f64
。