gpt4 book ai didi

rust - 使用特征找不到方法

转载 作者:行者123 更新时间:2023-12-03 11:27:41 26 4
gpt4 key购买 nike

我是 Rust 的初学者。我创建了一个名为 Floating 的特征,f32f64 实现了这个特征。通用结构 Vec 要求 T 必须实现 Floating 特性。我想计算向量的 norm,这不会编译,错误消息说 no method named sqrt found for type parameter T 在当前范围内。为什么会发生这种情况,它是如何运作的?

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

最佳答案

首先,您可能不应该将您的类型命名为 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)
}
}

这是 num crate 的位置派上用场,因为它定义了一个 Float trait ,其中包括一个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());
}

关于rust - 使用特征找不到方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65636392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com