考虑以下表示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;
但是,如果我再次使用p1
和p2
:
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)]
,这将使结构可复制。但是,我仍然不明白为什么引用不起作用。