Testcase: empty bounds

Bộ kiểm thử: ràng buộc rỗng

Theo cách các ràng buộc (bounds) hoạt động thì là ngay cả khi một trait không bao gồm bất cứ hàm nào, ta vẫn có thể sử dụng nó như một ràng buộc. EqCopy là những ví dụ của các trait như vậy từ thư viện std.

struct Cardinal;
struct BlueJay;
struct Turkey;

trait Red {}
trait Blue {}

impl Red for Cardinal {}
impl Blue for BlueJay {}

// Những hàm này chỉ hợp lệ với các kiểu dữ liệu đã triển khai các trait này.
// Thực tế là dù trait không có bất kì hàm nào cũng chẳng sao.
fn red<T: Red>(_: &T)   -> &'static str { "red" }
fn blue<T: Blue>(_: &T) -> &'static str { "blue" }

fn main() {
    let cardinal = Cardinal;
    let blue_jay = BlueJay;
    let _turkey   = Turkey;

    // Hàm `red()` không hoạt động với kiểu blue_jay
    // và ngược lại bởi các ràng buộc (bounds).
    println!("Chim hồng y giáo chủ có màu {}", red(&cardinal));
    println!("Chim giẻ cùi làm có màu {}", blue(&blue_jay));
    //println!("Gà tây có màu {}", red(&_turkey));
    // ^ TODO: Hãy thử bỏ comment dòng trên.
}

Tham khảo thêm:

std::cmp::Eq, std::marker::Copy, and traits