首页 > 解决方案 > 如何实现泛型类型的特征?

问题描述

在 Rust 中,为泛型​​类型实现特征的正确方法是什么?我希望我的向量由整数或浮点数组成。无论我希望 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]

标签: genericsmethodsrusttraitsimplementation

解决方案


您可以get_magnitide()限制只在T适用时工作。而不是约束T具有powi(),我建议将它们转换为f64最初并从那里进行数学计算。

您可以使用numAsPrimitive<f64> crate 中的特征:

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()
    }
}

您还可以通过特征将整个Vector结构限制为仅在T是数字时才起作用Num

use num::Num; // 0.4.0

pub struct Vector<T>
where
    T: Num
{
    i: T,
    j: T,
    k: T,
}

但是你仍然需要约束,get_magnitude()因为你强制它返回一个f64.


推荐阅读