我有一个新类型:
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;
实现会带来意想不到的效果吗?
最佳答案
实现 AddAssign
+=
确实需要运算符(operator)开始工作。
是否实现此特征的决定在很大程度上取决于您想要的实际类型和语义类型。这适用于您自己制作的任何类型,包括新类型。最重要的先决条件是可预测性:实现的行为应符合相同数学运算的预期。在这种情况下,考虑通过 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 具有检查算术运算的实现是否正确的 lint( suspicious_arithmetic_impl
和 suspicious_op_assign_impl
)。作为可预测的一部分,该特征的行为应该与相应的数学运算非常相似,无论 +
是否有效。或+=
被使用了。据我所知,目前没有 lint 或 API 指南建议实现 -Assign
特征以及相应的操作。
关于rust - 我应该在新类型上实现 AddAssign 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56703141/