Минимальные пары в T, & T и & mut T, необходимые для перегрузки оператора - PullRequest
1 голос
/ 29 июня 2019

Я пишу код перегрузки оператора для своего игрушечного трехмерного векторного типа, когда сталкиваюсь с проблемой.

Вот определение структуры и перегрузка подписки.

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`

Я совершенно сбит с толку и задаюсь вопросом, можете ли вы, ребята, пролить свет на это. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...