rust 无法乘以泛型的引用

prdp8dxp  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个有两个泛型的结构

pub struct Rectangle<T, U> {
    height: T,
    width: U,
    }

使用impl块

impl< T, U> Rectangle<T, U>
{
    pub fn new(height: T, width: U) -> Self {
        Self { height, width }
    }

    pub fn area(&self) -> &U {
        &self.width * &self.height // Error: cannot multiply `&U` by `&T`
    }
}

即使在穆尔impl之后也不起作用

如果删除ref(&),工作正常。

我认为最有效的方法是传递引用而不是复制。我怎样才能使这段代码编译引用。Code with ref

mf98qq94

mf98qq941#

问题是你假设&i32实现了Mul<&i32, Output = &i32>。它没有。虽然有一个类似的实现输出i32

// Error
// let r: &i32 = &100_i32 * &200_i32;

// Fine
let r: i32 = &100_i32 * &200_i32;

因此,为了解决这个问题,我们更改了trait绑定和函数签名,然后修复了较小的生命周期错误。

impl<'a, 'b: 'a, T: 'a, U: 'b> Rectangle<T, U>
where
    &'b U: Mul<&'a T, Output = U>,
{
    fn new(height: T, width: U) -> Self {
        Self { height, width }
    }

    fn area(&'b self) -> U {
        &self.width * &self.height
    }
}

既然我已经给出了解决方案,我建议您不要担心复制琐碎的类型。我认为引用在这种情况下更昂贵,除非你正在做一些奇怪的数学,其中T和U不是简单的数字,而是一些自定义结构,你实现了Mul,但我怀疑它。首先,指针被放置在堆栈上,大小可能是64位,并且它们需要被解引用来执行操作,这比仅仅将值放置在堆栈上要慢,堆栈的大小甚至可能比指针小,并且它们不需要被解引用。

相关问题