Ho alcuni tratti che (dopo aver tolto le funzioni e alcuni parametri gonfiare) assomigliano:esecuzione nidificati Tratti
trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }
Se U
implementa Bar<T>
per qualche T
attuazione Foo
eU
implementa Boo
, allora si è in grado derivare un'implementazione di Baz
per U
. Tuttavia, non ero in grado di scrivere codice Rust valido facendo questo.
alcuni tentativi sono stati:
impl<T: Foo, U: Bar<T> + Boo> Baz for U { }
che dà
error: the type parameter
T
is not constrained by the impl trait, self type, or predicates [E0207]
mentre
impl<U: Bar<T> + Boo> Baz for U { }
cede
error: type name
T
is undefined or not in scope [E0412]
Potrebbe uno/come si può farlo in Rust (stabile) (si spera senza alcun invio dinamico)?
Edit: Alcune persone hanno suggerito ad alcune domande simili per i quali vi erano essenzialmente due approcci (e trovo entrambi inadatti per la mia situazione):
- Uso dei tipi di associati. Non voglio farlo perché voglio tenere traccia di
T
, ad es. Voglio scrivere alcune funzioni che hanno una firma comefn bla<T: Foo, U: Bar<T>, V: Bar<T>>()
dove voglio sapere cheU
eV
implementanoBar<T>
per lo stessoT
. (Oppure esiste un modo per farlo con i tipi associati?) - Utilizzare una sorta di wrapping inserendo
U
eT
in una struttura. Non voglio usarlo neanche perché ho diversi livelli di tali "dipendenze dei tratti", quindi avvolgere le cose in ogni livello farebbe ingrossare molto il codice.
Quindi la domanda aggiornata sarebbe: Esiste una soluzione a questo problema senza l'utilizzo di tipi o wrapper associati?