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

标签 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;

实现会带来意想不到的效果吗?

最佳答案

实现 AddAssign += 确实需要运算符(operator)开始工作。

是否实现此特征的决定在很大程度上取决于您想要的实际类型和语义类型。这适用于您自己制作的任何类型,包括新类型。最重要的先决条件是可预测性:实现的行为应符合相同数学运算的预期。在这种情况下,考虑通过 Add 添加已经为该类型定义好了,并且没有什么可以阻止您就地实现等效操作,然后添加 implAddAssign这样是最可预测的事情。

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/

相关文章:

rust - 为什么需要像 Tokio 这样的异步运行时?

hashmap - 如何在不依赖 Copy 特性的情况下在 Rust 中构建 Cacher?

scala - 在Scala中可以使用traits来构建游戏组件系统吗?

c++ - 这是获取数字字符列表并使用它们创建长整数的有效方法吗?

c++ - 运算符重载的基本规则和惯用法是什么?

c++ - 为什么 std::is_same 不适用于 bool

generics - 从和进入实现

javascript - 如何解析 Rust 和 WebAssembly 中的函数指针

rust - 为什么编译器阻止我对使用 collect() 创建的 Vec 使用推送?

c - 数字左移-1的值是多少