非标量转换:进行泛型乘法时,`T` 转换为 `f64`

Cás*_*sio 3 casting traits rust

我想实现泛型类型结构的特征。特征块内的方法必须返回非泛型类型。我在尝试投射时遇到问题:

struct Rectangle<T> {
    x: T,
    y: T,
    width: T,
    height: T,
}

trait Area {
    fn area(&self) -> f64;
}

impl<T> Area for Rectangle<T>
    where T: std::ops::Mul<Output=T> 
{
    fn area(&self) -> f64 {
        let t_area = self.height * self.width;
        let f_area = t_area as f64;
        f_area
    }
}

fn main() {
    let sq = Rectangle { x: 0, y: 0, height: 1, width: 1 };
    println!("{}", sq.area());
}
Run Code Online (Sandbox Code Playgroud)

编译器输出是:

struct Rectangle<T> {
    x: T,
    y: T,
    width: T,
    height: T,
}

trait Area {
    fn area(&self) -> f64;
}

impl<T> Area for Rectangle<T>
    where T: std::ops::Mul<Output=T> 
{
    fn area(&self) -> f64 {
        let t_area = self.height * self.width;
        let f_area = t_area as f64;
        f_area
    }
}

fn main() {
    let sq = Rectangle { x: 0, y: 0, height: 1, width: 1 };
    println!("{}", sq.area());
}
Run Code Online (Sandbox Code Playgroud)

我可以在不使用不安全块的情况下进行转换Tf64

Mat*_* M. 5

我可以在不使用不安全块的情况下强制转换T为 吗f64

什么是Tu8要转换到的代码当然与要转换到的f64代码不同(毕竟后者可能会失败)。u64f64

在我看来,你面前有两条路:

  • 使Area泛型结束T,并因此返回T
  • 限制T为可以转换为的类型f64

我将演示后者:

impl<T> Area for Rectangle<T>
    where T: std::ops::Mul<Output=T> + Clone + std::convert::Into<f64>
{
    fn area(&self) -> f64 {
        self.height.clone().into() * self.width.clone().into()
    }
}
Run Code Online (Sandbox Code Playgroud)