Итоги — Мок-объект 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