Mam rodzajowe funkcji, która drukuje minimum dwóch przedmiotów:typu alias dla wielu cech
use std::fmt::Show;
fn print_min<T: PartialOrd + Show>(a: &T, b: &T) {
println!("min = {}", if a < b {a} else {b});
}
To działa całkiem dobrze z niczego, która implementuje zarówno PartialOrd
i Show
cechy:
print_min(&45i, &46i);
//min = 45
print_min(&"a", &"b");
//min = a
Ale dla mnie, gdybym musiał umieścić PartialOrd + Show
w definicji funkcji jest trochę brzydki, szczególnie jeśli chcę mieć całą masę funkcji, które działają na tym (na przykład implementowanie binarnego drzewa wyszukiwania), lub jeśli moje granice staną się bardziej kompilacyjne lex. Więc moim pierwszym skojarzeniem było próbować napisać alias typ:
type PartialShow = PartialOrd + Show;
ale niestety to daje mi niektóre dość dziwaczne błędy kompilatora:
src/test.rs:48:33: 48:47 error: only the builtin traits can be used as closure or object bounds
src/test.rs:48 type PartialShow = PartialOrd + std::fmt::Show;
^~~~~~~~~~~~~~
src/test.rs:48:20: 48:47 error: explicit lifetime bound required
src/test.rs:48 type PartialShow = PartialOrd + std::fmt::Show;
^~~~~~~~~~~~~~~~~~~~~~~~~~~
więc zgaduję albo moja składnia jest źle czy ten po prostu nie jest jeszcze możliwe. Czy istnieje obecnie sposób na uzyskanie pożądanego zachowania? np .:
type PartialShow = ???
fn print_min<T : PartialShow>{/*...*/}
Możesz napisać makro trait_alias zgodnie z opisem w http://stackoverflow.com/questions/30291584/macro-for-defining-trait-aliases – malbarbo