使用枚举类型
Axes
来限制 Coordinate
和 Quaternion
:#[derive(Clone)]
pub enum Axes {
Coordinate {
x: f64,
y: f64,
z: f64,
reserve: Vec<f64>,
},
Quaternion {
x: f64,
y: f64,
z: f64,
},
}
impl Axes {
pub fn shift(&mut self, Sample: &Axes) -> () {
let Dup: Axes = self.clone();
match Dup {
Axes::Coordinate { x, y, z, reserve } => match &Sample {
Axes::Coordinate { x, y, z, reserve } => {
*self = Axes::Coordinate {
x: *x,
y: *y,
z: *z,
reserve: reserve.to_vec(),
};
}
_ => panic!(),
},
Axes::Quaternion { x, y, z } => match &Sample {
Axes::Quaternion { x, y, z } => {
*self = Axes::Quaternion {
x: *x,
y: *y,
z: *z,
};
}
_ => panic!(),
},
}
}
}
使用特质 Axes
将 Coordinate
和 Quaternion
结构体进行链接:
pub trait Axes {
fn shift(&mut self, Sample: &Axes) -> ();
fn fold(&mut self, Sample: &Axes) -> ();
}
pub struct Coordinate {
pub x: f64,
pub y: f64,
pub z: f64,
pub reserve: Vec<f64>,
}
pub struct Quaternion {
pub x: f64,
pub y: f64,
pub z: f64,
}
impl Axes for Coordinate {
fn shift(&mut self, Sample: &Axes) -> () {}
fn fold(&mut self, Sample: &Axes) -> () {}
}
impl Axes for Quaternion {
fn shift(&mut self, Sample: &Axes) -> () {}
fn fold(&mut self, Sample: &Axes) -> () {}
}
在这种情况下,结构体上实现的特质更易访问和更高效吗?我不确定在什么情况下使用哪个。