为泛型结构体及Vec<泛型>实现approx crate trait遇问题
解决approx crate中Vec字段的AbsDiffEq实现问题
问题根源
你调用T::abs_diff_eq(&self.pos, &other.pos, epsilon)时出错,是因为abs_diff_eq是针对T类型的方法,但pos是Vec<T>而非T。approx crate已为Vec实现了AbsDiffEq trait,所以需要直接调用Vec<T>的对应方法,而非T的方法。
修正泛型实现
调整impl块,为Vec<T>添加AbsDiffEq约束,确保其epsilon类型与T一致,然后直接调用各字段的abs_diff_eq:
impl<T> approx::AbsDiffEq for Body<T> where T: approx::AbsDiffEq, T::Epsilon: Copy, Vec<T>: approx::AbsDiffEq<Epsilon = T::Epsilon>, { type Epsilon = T::Epsilon; fn default_epsilon() -> Self::Epsilon { T::default_epsilon() } fn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool { self.id == other.id && self.label == other.label && T::abs_diff_eq(&self.mass, &other.mass, epsilon) && self.pos.abs_diff_eq(&other.pos, epsilon) && self.vel.abs_diff_eq(&other.vel, epsilon) && T::abs_diff_eq(&self.obj_col, &other.obj_col, epsilon) } }
说明:
id是u8类型,直接用==即可(整数的绝对差比较等价于相等判断)String类型本身的精确比较通常不需要近似,直接用==- 为
Vec<T>添加约束,确保其近似比较的epsilon类型与T匹配
针对f64的专属实现
既然你实际场景中T只会是f64,可以直接为Body<f64>实现AbsDiffEq,代码更简洁:
impl approx::AbsDiffEq for Body<f64> { type Epsilon = f64; fn default_epsilon() -> Self::Epsilon { f64::default_epsilon() } fn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool { self.id == other.id && self.label == other.label && self.mass.abs_diff_eq(&other.mass, epsilon) && self.pos.abs_diff_eq(&other.pos, epsilon) && self.vel.abs_diff_eq(&other.vel, epsilon) && self.obj_col.abs_diff_eq(&other.obj_col, epsilon) } }
这种方式无需处理复杂的泛型约束,完全适配你的实际使用场景。
你提到的PartialEq替代方案
如果仅需要在==比较中嵌入近似逻辑,实现PartialEq也是可行方案:
impl<T: approx::AbsDiffEq<Epsilon = T>> PartialEq for Body<T> where T::Epsilon: Copy, Vec<T>: approx::AbsDiffEq<Epsilon = T>, { fn eq(&self, other: &Self) -> bool { let epsilon = T::default_epsilon(); self.id == other.id && self.label == other.label && self.mass.abs_diff_eq(&other.mass, epsilon) && self.pos.abs_diff_eq(&other.pos, epsilon) && self.vel.abs_diff_eq(&other.vel, epsilon) && self.obj_col.abs_diff_eq(&other.obj_col, epsilon) } }
注意:这种方式会覆盖结构体默认的PartialEq行为,需要确保团队成员清楚这一逻辑。
内容的提问来源于stack exchange,提问作者thefrollickingnerd
相关产品推荐
相关产品推荐

