你可以保留coordinates
作为主存储并提供通过名称访问每个存储的方法。
此外,实施Index
/IndexMut
特质给人一些安慰。
#[derive(Debug)]
struct Vector3D {
coordinates: [f64; 3],
}
impl Vector3D {
fn x(&self) -> f64 {
self.coordinates[0]
}
fn y(&self) -> f64 {
self.coordinates[1]
}
fn z(&self) -> f64 {
self.coordinates[2]
}
fn x_mut(&mut self) -> &mut f64 {
&mut self.coordinates[0]
}
fn y_mut(&mut self) -> &mut f64 {
&mut self.coordinates[1]
}
fn z_mut(&mut self) -> &mut f64 {
&mut self.coordinates[2]
}
}
impl std::ops::Index<usize> for Vector3D {
type Output = f64;
fn index(
&self,
idx: usize,
) -> &Self::Output {
&self.coordinates[idx]
}
}
impl std::ops::IndexMut<usize> for Vector3D {
fn index_mut(
&mut self,
idx: usize,
) -> &mut Self::Output {
&mut self.coordinates[idx]
}
}
fn main() {
let mut v = Vector3D {
coordinates: [1.1, 2.2, 3.3],
};
println!("x={}, y={}, z={}", v.x(), v.y(), v.z());
*v.x_mut() += 10.01;
*v.y_mut() += 20.02;
*v.z_mut() += 30.03;
for idx in 0..3 {
println!("v[{}]={}", idx, v[idx]);
v[idx] *= -1.0;
}
println!("v={:?}", v);
}
/*
x=1.1, y=2.2, z=3.3
v[0]=11.11
v[1]=22.22
v[2]=33.33
v=Vector3D { coordinates: [-11.11, -22.22, -33.33] }
*/