遇到问题时,我正在为玩具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`
我很困惑,想知道你们是否可以对此有所了解。预先感谢。