我有一个新类型:
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;
实施它会产生意想不到的影响吗?
答案 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_impl
和suspicious_op_assign_impl
)。作为可预测的一部分,无论使用的是+
还是+=
,该特征的行为都应非常类似于各自的数学运算。据我所知,目前还没有任何皮棉或API指南建议在相应操作旁边实现-Assign
特性。