Я бы хотел определить черту, которая имеет в качестве супертрата другую черту с собственным типом объекта черты в качестве связанного типа:
/// A trait for making things.
trait Make {
type Output: ?Sized;
fn make(self: Box<Self>) -> Box<Self::Output>;
}
/// A special case of Make, which makes things that impl the same trait.
trait Bootstrapper: Make<Output = dyn Bootstrapper> {} // Will NOT compile.
Однако я не могу этого сделать, поскольку он создает бесконечное числоцикл. В приведенном выше примере мне нужно было бы указать Output
для dyn Bootstrapper
, что само по себе (dyn Bootstrapper
). Но тогда мне нужно будет указать Output
для , dyn Bootstrapper
, и так далее, например, Make<Output = dyn Bootstrapper<Output = dyn Bootstrapper<Output = dyn Bootstrapper<...>>>
.
Компилятор Rust, похоже, согласен с тем, чтоне будет работать:
error[E0391]: cycle detected when computing the supertraits of `Bootstrapper`
--> src/lib.rs:8:1
|
8 | trait Bootstrapper: Make<Output = dyn Bootstrapper> {} // Will NOT compile.
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: ...which again requires computing the supertraits of `Bootstrapper`, completing the cycle
note: cycle used when collecting item types in top-level module
--> src/lib.rs:8:1
|
8 | trait Bootstrapper: Make<Output = dyn Bootstrapper> {} // Will NOT compile.
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Я также не могу указать Output = Self
, потому что это чрезмерно ограничит черту, так что данная реализация Bootstrapper
может только на make()
больше себя. Я хочу, чтобы Bootstrapper
смог make()
других видов Bootstrapper
. Пожалуйста, посмотрите на эту Rust площадку для примера (примерно) того, что я пытаюсь сделать.
Есть ли способ обойти это, и Bootstrapper
указать Bootstrapper
( не Self
) для Output
?