Параметр Self in type вне структуры в ржавчине

#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< ... >>>>>>;