Конечно типажи тоже могут быть обобщёнными. Здесь мы определяем, тот который повторно реализует типаж Drop как обобщённый метод, чтобы удалить себя и входные данные.
// Некопируемые типы.
struct Empty;
struct Null;
// Обобщённый типаж от `T`.
trait DoubleDrop {
// Определим метод для типа вызывающего объекта,
// который принимает один дополнительный параметр `T` и ничего с ним не делает.
fn double_drop(self, _: T);
}
// Реализация `DoubleDrop` для любого общего параметра `T` и
// вызывающего объекта `U`.
impl DoubleDrop for U {
// Этот метод получает право владения на оба переданных аргумента и
// освобождает их.
fn double_drop(self, _: T) {}
}
fn main() {
let empty = Empty;
let null = Null;
// Освободить `empty` и `null`.
empty.double_drop(null);
//empty;
//null;
// ^ TODO: Попробуйте раскомментировать эти строки.
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Drop, struct и trait