重载加法运算符()

重载加法运算符(+)需要实现 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
    }
}