使用trait找不到方法

我是 Rust 的初学者。我创建了一个名为 的特征Floatingf32f64实现了这个特征。Vec要求T必须实现 Floatingtrait 的通用结构。我想计算norm向量,这不会编译,错误消息说no method named sqrtfor type parameter Tin the current scope。为什么会发生这种情况以及它将如何运作?

use std::ops::{Mul, Add};

trait Floating: Sized + Copy + Clone + Mul<Output=Self> + Add<Output=Self> {}

impl Floating for f32 {}

impl Floating for f64 {}

struct Vec<T: Floating> {
    x: T,
    y: T,
    z: T,
}

impl<T: Floating> Vec<T> {
    fn norm(&self) -> T {
        (self.x * self.x + self.y * self.y + self.z * self.z).sqrt()
    }
}


fn main() {
    let v: Vec<f32> = Vec {x: 1.0, y: 1.0, z: 1.0};
    println!("norm is {:?}", v.norm());
}

回答

首先,您可能不应该命名您的 type Vec,以避免与std::vec::Vec容器发生冲突和混淆。


问题是(您的)Vec只知道T需要Floating,并且Floating没有sqrt方法。所以你需要自己定义。

trait Floating: Sized + Copy + Clone + Mul<Output = Self> + Add<Output = Self> {
    fn sqrt(self) -> Self;
}

impl Floating for f32 {
    fn sqrt(self) -> Self {
        f32::sqrt(self)
    }
}

impl Floating for f64 {
    fn sqrt(self) -> Self {
        f64::sqrt(self)
    }
}

这是numcrate派上用场的地方,因为它定义了一个Floattrait,其中包括一个sqrt()方法。使用num您可以将示例简化为:

// num = "0.3"
use num::Float;

struct Vec<T: Float> {
    x: T,
    y: T,
    z: T,
}

impl<T: Float> Vec<T> {
    fn norm(&self) -> T {
        (self.x * self.x + self.y * self.y + self.z * self.z).sqrt()
    }
}

fn main() {
    let v: Vec<f32> = Vec {
        x: 1.0,
        y: 1.0,
        z: 1.0,
    };
    println!("norm is {:?}", v.norm());
}


以上是使用trait找不到方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>