如何实现泛型类型的特征?

时间:2021-04-07 00:10:30

标签: generics methods rust traits implementation

在 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]

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