Я пишу код перегрузки оператора для своего игрушечного трехмерного векторного типа, когда сталкиваюсь с проблемой.
Вот определение структуры и перегрузка подписки.
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`
Я совершенно сбит с толку и задаюсь вопросом, можете ли вы, ребята, пролить свет на это. Заранее спасибо.