2014-09-27 40 views
11

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ả PartialOrdShow đặ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>{/*...*/} 
+0

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

Trả lời

14

PartialOrdShow là đặc điểm, nó đã được thảo luận here làm thế nào để thực hiện một bí danh nhưng nó được quyết định rằng nó không cần thiết.

Vì vậy, bạn có thể viết các bí danh bạn muốn với:

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"); 
} 

Hy vọng nó giúp.

+1

Cảm ơn bạn đã liên kết đến cuộc thảo luận, bây giờ có ý nghĩa hơn tại sao nó được quyết định không để bao gồm nó. –

Các vấn đề liên quan