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