我有一个结构体,主要封装了一个向量:
struct Group<S> {
elements: Vec<S>
}
我还有一个简单的特性,也被实现在其他结构体中:
trait Solid {
fn intersect(&self, ray: f32) -> f32;
}
我想要为Group
实现Solid
,但我希望能够同时用于相同实现的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>>
不是一个很好的选择。
?Sized
的现有句子,是否更清晰了? - ShepmasterBox<Solid>
是一个Solid
,那么在使用它作为一个需要&Solid
的函数参数时,我们将有两个“重定向”,这对性能有影响吗?此外,在什么情况下实现引用会很有用? - Carl Levasseur