T,&T和&mut T中的最小对需要使操作符重载

时间:2019-06-29 14:30:36

标签: rust operator-overloading

遇到问题时,我正在为玩具3D矢量类型编写操作符重载代码。

这是结构定义和订阅重载。

pub struct Vec3([f32; 3]);

impl Index<usize> for Vec3 {
    type Output = f32;

    fn index(&self, index: usize) -> &Self::Output {
        &self.0[index]
    }
}

impl IndexMut<usize> for Vec3 {
    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
        &mut self.0[index]
    }
}


impl Neg for Vec3 {
    type Output = Self;

    fn neg(self) -> Self::Output {
        let mut v = self;
        for i in 0..3 {
            v[i] = -v[i];
        }
        v
    }
}

然后我实现了&mut T += &T并编写了一些测试代码

impl AddAssign<&Vec3> for Vec3 {
    fn add_assign(&mut self, rhs: &Vec3) {
        for i in 0..3 {
            self[i] += rhs[i];
        } 
    }
}

impl AddAssign<&Vec3> for &mut Vec3 {
    fn add_assign(&mut self, rhs: &Vec3) {
        (*self).add_assign(rhs);
    }
}

#[cfg(test)]
mod tests {
    use super::Vec3;

    #[test]
    fn test_add() {
        let mut v = -Vec3::new(1f32, 2f32, 3f32);
        let mut w = -Vec3::new(1f32, 2f32, 3f32);
        {
            let mut vv = &mut v;
            let ww = &mut w;
            vv += ww;
            println!("{:?}", vv);
        }
    }
}

请注意,&mut T += &mut T现在可以使用。但是当我继续实施&mut T += T

impl AddAssign<Vec3> for &mut Vec3 {
    fn add_assign(&mut self, rhs: Vec3) {
        (*self).add_assign(&rhs);
    }
}

&mut T += &mut T不再有效

error[E0277]: cannot add-assign `&mut Vec3` to `&mut Vec3`
   --> vec3/src/lib.rs:170:10
    |
170 |             vv += ww;
    |                ^^ no implementation for `&mut Vec3 += &mut Vec3`
    |
    = help: the trait `std::ops::AddAssign<&mut Vec3>` is not implemented for `&mut Vec3`

我很困惑,想知道你们是否可以对此有所了解。预先感谢。

0 个答案:

没有答案