Реализация обобщенного трейта для двойного освобождения памяти

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом лабораторном задании определяется общий трейт DoubleDrop, который включает метод double_drop, позволяющий типу освобождать сам себя и входной параметр.

Примечание: Если лабораторная работа не уточняет имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Трейты

Конечно, трейты могут быть также обобщенными. Здесь мы определяем один, который переопределяет трейт Drop в виде обобщенного метода для освобождения самой себя и входного параметра.

// Не копирующиеся типы.
struct Empty;
struct Null;

// Трейт, обобщенный по `T`.
trait DoubleDrop<T> {
    // Определите метод для вызывающего типа, который принимает
    // дополнительный параметр `T` и ничего с ним не делает.
    fn double_drop(self, _: T);
}

// Реализуйте `DoubleDrop<T>` для любого обобщенного параметра `T` и
// вызывающего типа `U`.
impl<T, U> DoubleDrop<T> for U {
    // Этот метод получает владение обоими переданными аргументами,
    // освобождая обоих.
    fn double_drop(self, _: T) {}
}

fn main() {
    let empty = Empty;
    let null  = Null;

    // Освободите память от `empty` и `null`.
    empty.double_drop(null);

    //empty;
    //null;
    // ^ TODO: Попробуйте раскомментировать эти строки.
}

Резюме

Поздравляем! Вы завершили лабораторную работу по Трейтам. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.