Rustの演算子のオーバーロードで借用してmoveさせないようにする方法 - std::ops::AddとかMulとか
経緯
公式ドキュメント:のimpl Add for Point { ...だと+するごとにmoveして所有権が移ってしまって、lhsやrhsが使えなくなってしまう。それを防ぐために借用したかった。 それを実現するのは単純で以下のようにすれば良かった。
方法
code:rs
use std::ops::Add;
struct Point {
x: i32,
y: i32,
}
impl Add for &Point {
type Output = Point;
fn add(self, other: Self) -> Point {
Point {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
fn main() {
let p1 = Point{x: 1, y: 3};
let p2 = Point{x: -8, y: 6};
println!("{:?}", &p1 + &p2);
println!("{:?}", &(&p1 + &p2) + &p2);
}
code:出力結果
Point { x: -7, y: 9 }
Point { x: -15, y: 15 }
fn add(self, other: &Point)のselfが&selfにならない理由は、self自体が&Point型だから。
Add<Rhs>という感じなので型パラメータのところはRHS(=right hand side)の型を入れている