我有两个结构,即struct A
和struct B
。我已经为A
和B
实现了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
}
}