Tôi có một chức năng chung mà in ra tối thiểu là hai hạng mục:Loại bí danh cho nhiều đặc điểm
use std::fmt::Show;
fn print_min<T: PartialOrd + Show>(a: &T, b: &T) {
println!("min = {}", if a < b {a} else {b});
}
này hoạt động khá tốt với bất cứ điều gì mà thực hiện cả PartialOrd
và Show
đặc điểm:
print_min(&45i, &46i);
//min = 45
print_min(&"a", &"b");
//min = a
Nhưng với tôi phải đặt PartialOrd + Show
vào định nghĩa hàm là xấu xí, đặc biệt nếu tôi muốn có một bó toàn bộ các hàm hoạt động trên đó (ví dụ như thực hiện tìm kiếm nhị phân), hoặc nếu giới hạn của tôi thu được nhiều hơn lex. Vì vậy, nghiêng đầu tiên của tôi là cố gắng để viết một loại bí danh:
type PartialShow = PartialOrd + Show;
nhưng tiếc này mang lại cho tôi một số lỗi biên dịch khá kỳ lạ:
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;
^~~~~~~~~~~~~~~~~~~~~~~~~~~
Vì vậy, tôi đoán hai cú pháp của tôi là sai hay này chỉ là không thể. Có cách nào để có được hành vi mong muốn này không? ví dụ .:
type PartialShow = ???
fn print_min<T : PartialShow>{/*...*/}
Bạn có thể viết macro trait_alias như được mô tả trong http://stackoverflow.com/questions/30291584/macro-for-defining-trait-aliases – malbarbo