我应该在新类型上实现AddAssign吗?

时间:2019-06-21 12:05:52

标签: rust operators traits assignment-operator

我有一个新类型:

struct NanoSecond(u64);

我想为此添加其他功能。 (我实际上正在使用derive_more,但这是一个MCVE。)

impl Add for NanoSecond {
    fn add(self, other: Self) -> Self {
        self.0 + other.0
    }
}

但是我应该实现AddAssign吗?这项工作是否需要?

let mut x: NanoSecond = 0.to();
let y: NanoSecond = 5.to();
x += y;

实施它会产生意想不到的影响吗?

1 个答案:

答案 0 :(得分:3)

+=操作员的工作确实需要实施AddAssign

是否实施此特征的决定将在很大程度上取决于您所针对的实际类型和语义。这适用于您自己制作的任何类型,包括新类型。最重要的先决条件是可预测性:实现应在相同的数学运算中达到预期的性能。在这种情况下,考虑到已经通过Add对该类型进行了很好的定义,没有什么可以阻止您就地实现等效操作,然后添加impl AddAssign之类的方法最容易预测。

impl AddAssign for NanoSecond {
    fn add_assign(&mut self, other: Self) {
        self.0 += other.0
    }
}

还可以选择为引用类型提供其他实现,作为第二个操作数(例如Add<&'a Self>AddAssign<&'a Self>)。

请注意,Clippy具有棉绒,可以检查算术运算的执行是否正确(suspicious_arithmetic_implsuspicious_op_assign_impl)。作为可预测的一部分,无论使用的是+还是+=,该特征的行为都应非常类似于各自的数学运算。据我所知,目前还没有任何皮棉或API指南建议在相应操作旁边实现-Assign特性。