Я хочу создать структуру, которая обертывает другой тип, но может принимать как собственные, так и заимствованные версии значений, реализующих данную черту.
Например, допустим, у меня есть черта Foobar
:
trait Foobar {
fn foobar(&self);
}
Теперь я хочу создать структуру, которая обертывает значения или заимствованные ссылки на эту черту:
struct FoobarWrapper<T: Foobar> {
wrapped: T,
extra_stuff: Stuff
}
Здесь я хочу, чтобы FoobarWrapper работал как с Baz
, так и с &Baz
, учитывая, что impl Foobar for Baz
.
Я придумал одно решение, которое может сработать, но я не знаю, идиоматично ли оно, и нужно просто сделать:
impl<'a, T: Foobar> Foobar for &'a T {
fn foobar(&self) {
(*self).foobar()
}
}
Если я не ошибаюсь, здесь любая ссылка на значение, реализующее Foobar, также является разработчиком Foobar. Но так ли вы должны это делать?