Use Add in AddAssign



我有两个结构,即struct Astruct B。我已经为AB实现了Add

impl Add<&B> for A{
type Output = A;
fn add(self, rhs: &B) -> A{
--snip--
}

现在,我想实现AddAssign,但我认为应该有一种惯用的方法来使用Add。类似于:

impl AddAssign<&B> for A {
fn add_assign(&mut self, rhs: &B) {
*self = *self + rhs;
}
}

有办法做到吗?

将它们链接在一起是个好主意,但您遇到的问题是解引用导致移出借用值。通常更容易采用另一种方式,实现AddAssign,然后在Add中使用它。您可以将self更改为mut self,它像往常一样拥有所有权,但只允许在适当的位置对其进行修改,然后立即返回:

struct A;
struct B;
impl Add<&B> for A {
type Output = A;
fn add(mut self, rhs: &B) -> A {
self += rhs;
self
}
}
impl AddAssign<&B> for A {
fn add_assign(&mut self, rhs: &B) {
todo!()
}
}

如果你真的需要它们按这个顺序排列,那么A必须是Copy和/或Clone。这可能看起来像:

#[derive(Clone, Copy)]
struct A;
struct B;
impl Add<&B> for A {
type Output = A;
fn add(mut self, rhs: &B) -> A {
todo!()
}
}
impl AddAssign<&B> for A {
fn add_assign(&mut self, rhs: &B) {
*self = *self + rhs
}
}

#[derive(Clone)]
struct A;
struct B;
impl Add<&B> for A {
type Output = A;
fn add(mut self, rhs: &B) -> A {
todo!()
}
}
impl AddAssign<&B> for A {
fn add_assign(&mut self, rhs: &B) {
*self = self.clone() + rhs
}
}

最新更新