Traits

Tất nhiên trait cũng có thể là generic. Ở đây chúng ta định nghĩa một phương thức triển khai lại Drop trait như một phương thức generic để Drop chính nó và input.

// Các kiểu không thể coppy.
struct Empty;
struct Null;

// Một trait generic `T`.
trait DoubleDrop<T> {

    // Định nghĩa một method trên type hiện tại, method nhận một giá trị khác
    // cũng có kiểu `T` và không làm gì với nó.
    fn double_drop(self, _: T);
}

// Implement `DoubleDrop<T>` cho mọi generic parameter `T` và
// caller `U`.
impl<T, U> DoubleDrop<T> for U {
    // Method này sẽ take ownership của cả 2 tham số, 
    // sau đó giải phóng bộ nhớ cho cả 2.
    fn double_drop(self, _: T) {}
}
fn main() {
    let empty = Empty;
    let null  = Null;

    // Giải phóng `empty` and `null`.
    empty.double_drop(null);

    //empty;
    //null;
    // ^ TODO: Try uncommenting these lines.
}