C’è un modo per creare un alias di tipo per più tratti?

Ho una funzione generica che stampa il minimo di due elementi:

use std::fmt::Display; fn print_min(a: &T, b: &T) { println!("min = {}", if a < b { a } else { b }); } 

Funziona molto bene con qualsiasi cosa che implementa i tratti di PartialOrd e Display :

 print_min(&45, &46); // min = 45 print_min(&"a", &"b"); // min = a 

Dover mettere il PartialOrd + Display nella definizione della funzione è un po ‘brutto, soprattutto se voglio avere un sacco di funzioni che operano su questo (implementando un albero di ricerca binario, per esempio), o se i miei limiti diventano più complessi. La mia prima inclinazione fu di tentare di scrivere un alias di tipo:

 type PartialDisplay = PartialOrd + Display; 

ma questo mi dà alcuni errori del compilatore abbastanza bizzarri:

 error[E0393]: the type parameter `Rhs` must be explicitly specified --> src/main.rs:7:23 | 7 | type PartialDisplay = PartialOrd + Display; | ^^^^^^^^^^ missing reference to `Rhs` | = note: because of the default `Self` reference, type parameters must be specified on object types error[E0225]: only auto traits can be used as additional traits in a trait object --> src/main.rs:7:36 | 7 | type PartialDisplay = PartialOrd + Display; | ^^^^^^^ non-auto additional trait 

Immagino che la mia syntax sia sbagliata o che questo non sia ancora ansible. Mi piacerebbe qualcosa di simile

 type PartialDisplay = ??? fn print_min { /* ... */ } 

PartialOrd e Display sono tratti. È stato discusso come implementare un alias ma è stato deciso che non era necessario.

Invece, puoi creare un nuovo tratto con i tratti che vuoi come super tratti e fornire un’implementazione coperta:

 use std::fmt::Display; trait PartialDisplay: PartialOrd + Display {} impl PartialDisplay for T {} fn print_min(a: &T, b: &T) { println!("min = {}", if a < b { a } else { b }); } fn main() { print_min(&45, &46); print_min(&"aa", &"bb"); } 

RFC 1733 ha introdotto il concetto di un alias di tratto . Quando sarà implementato , sarai in grado di dire:

 trait PartialDisplay = PartialOrd + Display;