Итоги — Мок-объект Smart Pointer
Часть раздела Object Oriented Programming путешествия по Rust на Coddy. Урок 58 из 61.
Задание
ЛегкоДавайте создадим имитацию умного указателя под названием 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
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust