生锈错误:使用移动的值

时间:2017-11-03 15:56:23

标签: rust operator-overloading traits

考虑以下表示Point的结构:

struct Point { x:i32, y:i32, }

我试图像这样重载这个结构的加号运算符:

impl ops::Add<Point> for Point {
    type Output = Point;
    fn add(self, rhs:Point) -> Self::Output {
        Point{x:(self.x + rhs.x), y:(self.y + rhs.y)}
    }
}

然后我测试了它并按预期工作:

let mut p1:Point = Point{x:1, y:1};
let mut p2:Point = Point{x:2, y:3};

let mut pAdd:Point = p1 + p2;

但是,如果我再次使用p1p2

let mut pAdd:Point = p1 + p2;
let mut pAdd2:Point = p1 + p2;

我收到以下错误:

  

错误:使用移动值p1

事实证明这对Rust来说是正常的,因为在这种情况下变量被移动而不是被复制。所以,我认为我所要做的就是稍微更改加上运算符函数(参考 - &amp;)。我做了:

fn add(&self, rhs:&Point) -> Self::Output {
    Point{x:(self.x + rhs.x), y:(self.y + rhs.y)}
}

但这又失败了,我得到了这个错误:

  

错误:方法add的特征类型不兼容:预期结构Point,找到&amp; -ptr

我该怎么办?

编辑:感谢@GrégoryOBANOS我发现我可以添加#[derive(Copy, Clone)],这将使结构可复制。但是,我仍然不明白为什么引用不起作用。

0 个答案:

没有答案