Menu
Coddy logo textTech

Итоги — Мок-объект Smart Pointer

Часть раздела Object Oriented Programming путешествия по Rust на Coddy. Урок 58 из 61.

challenge icon

Задание

Легко

Давайте создадим имитацию умного указателя под названием SmartBox, которая демонстрирует, как работают настоящие умные указатели в Rust изнутри! Ваша обертка будет универсальной (generic), обеспечит доступ к внутреннему значению и будет автоматически сообщать о своей очистке.

Вы организуете свой код в двух файлах:

  • smart_box.rs: Определите публичную универсальную структуру SmartBox<T> с единственным полем value типа T. Реализуйте связанную функцию new, которая создает SmartBox и выводит сообщение о создании. Добавьте метод get, который возвращает ссылку на внутреннее значение. Наконец, реализуйте типаж Drop для вывода сообщения об очистке, когда SmartBox выходит из области видимости.
  • main.rs: Подключите ваш модуль smart_box и продемонстрируйте работу SmartBox с двумя разными типами. Создайте SmartBox<i32>, содержащий число, и SmartBox<String>, содержащий текст (оба значения берутся из предоставленных входных данных). Выведите значения, используя метод get. Сообщения Drop появятся автоматически, когда боксы выйдут из области видимости в конце функции main.

При создании SmartBox должно выводиться сообщение:

SmartBox created

При доступе к значению выводите его в следующем формате:

Value: {value}

При удалении (drop) SmartBox должно выводиться сообщение:

SmartBox dropped

Например, при входных данных 42 и Hello:

SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox dropped

Обратите внимание, что сначала создаются оба бокса, затем происходит доступ к их значениям, и, наконец, оба удаляются в обратном порядке (последний созданный удаляется первым), когда завершается выполнение main.

Вы получите два входных значения: целое число (преобразуйте в i32) и строку.

Попробуйте сами

mod smart_box;

use smart_box::SmartBox;

fn main() {
    // Чтение входных данных
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let number: i32 = input1.trim().parse().expect("Failed to parse number");
    
    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let text = input2.trim().to_string();
    
    // TODO: Создать SmartBox<i32>, содержащий число
    
    // TODO: Создать SmartBox<String>, содержащий текст
    
    // TODO: Вывести значения, используя метод get
    // Формат: "Value: {value}"
    
    // Сообщения Drop появятся автоматически при завершении main
}

Все уроки раздела Object Oriented Programming

Потренируйтесь самостоятельно: Онлайн-компилятор Rust