AddMul

運算子超載會透過 std::ops: 內的特徵實作:

#[derive(Debug, Copy, Clone)]
struct Point { x: i32, y: i32 }

impl std::ops::Add for Point {
    type Output = Self;

    fn add(self, other: Self) -> Self {
        Self {x: self.x + other.x, y: self.y + other.y}
    }
}

fn main() {
    let p1 = Point { x: 10, y: 20 };
    let p2 = Point { x: 100, y: 200 };
    println!("{:?} + {:?} = {:?}", p1, p2, p1 + p2);
}

討論要點:

  • 您可以針對 &Point 實作 Add。但這能在哪些情況派上用場?
    • 回答:Add:add 會耗用 self。如果您要超載運算子的型別 T 不是 Copy,建議您一併為 &T 超載運算子。這可避免呼叫點中出現不必要 的複製作業。
  • 為什麼 Output 是關聯型別?可將其用做方法的型別參數嗎?
    • 簡答:函式型別參數是由呼叫端控管,但 Output 這類關聯型別則由特徵 實作者控管。
  • 您可以針對兩種不同型別實作 Add,舉例來說, impl Add<(i32, i32)> for Point 會將元組新增至 Point