過載加法運算子()

過載加法運算子(+)需要實現 std::ops::Add 特徵。

從文件中,特徵的完整定義是:

pub trait Add<RHS = Self> {
    type Output;
    fn add(self, rhs: RHS) -> Self::Output;
}

它是如何工作的?

  • 該特徵是針對左手側型別實施的
  • 該特徵是針對一個右手側引數實現的,除非指定它預設具有與左手側相同的型別
  • 新增結果的型別在相關型別 Output 中指定

因此,具有 3 種不同型別是可能的。

注意:trait 消耗是左側和右側引數,你可能更喜歡將其實現為對型別的引用而不是裸型別。

為自定義型別實現+

use std::ops::Add;

#[derive(Clone)]
struct List<T> {
    data: Vec<T>,
}
//  Implementation which consumes both LHS and RHS
impl<T> Add for List<T> {
    type Output = List<T>;

    fn add(self, rhs: List<T>) -> List<T> {
        self.data.extend(rhs.data.drain(..));
        self
    }
}

//  Implementation which only consumes RHS (and thus where LHS != RHS)
impl<'a, T: Clone> Add<List<T>> for &'a List<T> {
    type Output = List<T>;

    fn add(self, rhs: List<T>) -> List<T> {
        self.clone() + rhs
    }
}