Generic Trait
Trait cũng có thể được tổng quát hóa.
// Non-copyable types.
struct Empty;
struct Null;
// A trait generic over `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 take ownership của cả 2 arguments,
// sau đó giải phóng bộ nhớ cho cả 2, do ra khỏi scope {}
// mà không làm gì cả.
fn double_drop(self, _: T) {}
}
fn main() {
let empty = Empty;
let null = Null;
// Deallocate `empty` and `null`.
empty.double_drop(null);
// TODO: uncomment
// empty;
// null;
}