我有打印的最小的兩個項目的通用功能:類型別名多性狀
use std::fmt::Show;
fn print_min<T: PartialOrd + Show>(a: &T, b: &T) {
println!("min = {}", if a < b {a} else {b});
}
這工作得很好,與任何實現兩個PartialOrd
和Show
性狀:
print_min(&45i, &46i);
//min = 45
print_min(&"a", &"b");
//min = a
但對我來說,必須將PartialOrd + Show
放入函數定義中是一件很難看的事情,特別是如果我想要一大堆函數對此進行操作(例如,實現一個二叉搜索樹),或者如果我的邊界變得更加複雜法。所以我的第一個傾向是試圖寫一個類型別名:
type PartialShow = PartialOrd + Show;
但不幸的是這給了我一些非常奇怪的編譯器錯誤:
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;
^~~~~~~~~~~~~~~~~~~~~~~~~~~
所以我猜測,要麼是我的語法錯誤,或者這只是不可能。目前有什麼方法可以獲得這種期望的行爲?例如: -
type PartialShow = ???
fn print_min<T : PartialShow>{/*...*/}
您可以編寫一個宏trait_alias,如http://stackoverflow.com/questions/30291584/macro-for-defining-trait-aliases中所述 – malbarbo 2016-05-03 17:43:36