#types #rust #traits
Вопрос:
Я работаю над некоторыми шаблонами, подобными этому:
trait FooThis {
type Foo;
fn foo(amp;self) -> amp;Self::Foo;
}
struct SomeFooImpl<T: FooThis>(fn(amp;mut T));
trait Foo {}
impl<T: FooThis> Foo for SomeFooImpl<T> {}
struct Bar<T: Foo>(T);
impl<T: Foo> FooThis for Bar<T> {
type Foo = T;
fn foo(amp;self) -> amp;Self::Foo {
amp;self.0
}
}
// type B = Bar<SomeFooImpl<B>>;
В принципе, существует множество структур , реализующих Foo
подобные SomeFooImpl
, и набор структур, реализующих FooThis
подобные Bar
, и я хочу, чтобы все комбинации работали.
Таким образом , проблема здесь в том, что когда я пытаюсь инициировать impl FooThis
, например, Bar
с SomeFooImpl
, мне нужен тип, который я инициирую, появляется в списке параметров. Я не могу использовать Self
его для достижения этой цели, потому что он не входит Bar
в определение (или что-либо реализует FooThis
). Перенос Bar
, чтобы скрыть параметр типа, также сделает его невозможным для реализации FooThis
, поэтому я тоже не могу этого сделать.
Одним из возможных решений является исключение параметра типа of SomeFooImpl
путем изменения указателя функции на fn(amp;mut dyn FooThis)
, но я пытаюсь избежать этого.
Есть ли способ решить эту проблему с помощью статической диспетчеризации? Все, кроме Foo
FooThis
черт и, может быть изменено.
Комментарии:
1. Это бесконечный саморекурсивный тип, который Rust не поддерживает.
type B = Bar<SomeFooImpl<Bar<SomeFooImpl<Bar<SomeFooImpl< ... >>>>>>;