2014-09-27 13 views
11

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>{/*...*/} 
+0

Możesz napisać makro trait_alias zgodnie z opisem w http://stackoverflow.com/questions/30291584/macro-for-defining-trait-aliases – malbarbo

Odpowiedz

14

PartialOrd i Show są cechy, zostało omówione here jak zaimplementować alias ale to postanowiono, że to nie było potrzebne.

Więc można napisać alias chcesz z:

use std::fmt::Show; 

trait PartialShow: PartialOrd + Show {} 
impl<T: PartialOrd + Show> PartialShow for T {} 

fn print_min<T: PartialShow>(a: &T, b: &T) { 
    println!("min = {}", if a < b {a} else {b}); 
} 

fn main() { 
    print_min(&45i, &46i); 
    print_min(&"aa", &"bb"); 
} 

Nadzieję, że pomogło.

+1

Dzięki za połączenie z dyskusją, masz teraz więcej sensu, dlaczego zdecydowano, że nie do włączenia. –