我有一个主要封装向量的 struct :
struct Group<S> {
elements: Vec<S>
}
我还有一个简单的特点,也适用于其他 struct :
trait Solid {
fn intersect(&self, ray: f32) -> f32;
}
我想用Solid
来实现Group
,但我希望能够将Group
用于Solid
的相同实现列表和Solid
的混合实现列表.基本上我想同时使用Group<Box<Solid>>
和Group<Sphere>
(Sphere
和Solid
).
目前我使用的是这样的东西:
impl Solid for Group<Box<Solid>> {
fn intersect(&self, ray: f32) -> f32 {
//do stuff
}
}
impl<S: Solid> Solid for Group<S> {
fn intersect(&self, ray: f32) -> f32 {
//do the same stuff, code copy-pasted from previous impl
}
}
这是可行的,但让同一代码逐行重复两次并不是惯用的解决方案.我肯定错过了什么明显的东西?
在我的例子中,我衡量了两种trait实现之间的显著性能差异,所以总是使用Group<Box<Solid>>
并不是一个好的 Select .