У меня есть структура, которая в основном инкапсулирует вектор:Черта реализации как для объекта признака и для прямых реализаторов признака
struct Group<S> {
elements: Vec<S>
}
У меня также есть простой признак, который также реализован для других структур:
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
}
}
Это работает, но с линии-в-линии и тот же код дважды не может быть идиоматических решением. Я должен упустить что-то очевидное?
В моем случае я измеряю заметную разницу в производительности между обоими реализациями признаков, поэтому всегда использовать Group<Box<Solid>>
- отличный вариант.
Что делает '? Sized', чтобы заставить его работать? –
@CarlLevasseur Я обновил существующее предложение о '? Sized'; неужели это яснее? – Shepmaster
Да, поэтому, если 'Box' '' Solid', то использовать его в функции, которая принимает '& Solid', у нас было бы 2« перенаправления », это влияет на производительность? Кроме того, когда полезно реализовать его для ссылок? –