Итоги — Безопасный сейф
Часть раздела Object Oriented Programming путешествия по Rust на Coddy. Урок 13 из 61.
Задание
ЛегкоДавайте создадим систему защищенного шкафчика, которая объединит все, что вы узнали об инкапсуляции! Ваш шкафчик будет защищать свое содержимое с помощью секретного кода — только тот, кто знает код, сможет увидеть, что находится внутри.
Вы создадите два файла для организации своего кода:
locker.rs: Определите структуруLockerс двумя приватными полями:code(u32) иcontents(String). Структура должна быть публичной, но оба поля должны оставаться приватными для обеспечения безопасности шкафчика. Реализуйте:- Конструктор
new, который принимает начальный код и содержимое - Метод
set_code, который позволяет изменить код шкафчика - Метод
get_contents, который принимает попытку ввода кода — если он совпадает с кодом шкафчика, возвращает содержимое; в противном случае возвращает"Access denied"
- Конструктор
main.rs: Подключите модуль locker, создайте шкафчик и продемонстрируйте его функции безопасности, пытаясь получить доступ к содержимому с помощью правильного и неправильного кодов.
Метод get_contents должен возвращать String — либо фактическое содержимое, когда код верный, либо сообщение об отказе, когда он неверный. Это ваш условный геттер, который проверяет доступ перед раскрытием приватных данных.
Ваш вывод должен соответствовать следующему формату:
Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}Например, если вы создадите шкафчик с кодом 1234 и содержимым "Gold coins", затем попробуете код 0000, измените код на 5678 и попробуете 5678, вывод будет таким:
Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coinsВы получите пять входных данных: начальный код, содержимое, код первой попытки, новый код для установки и код второй попытки.
Попробуйте сами
mod locker;
use locker::Locker;
fn main() {
// Чтение входных данных
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_code: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let contents = input.trim().to_string();
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let first_attempt: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let new_code: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let second_attempt: u32 = input.trim().parse().expect("Invalid number");
// TODO: Создать новый Locker с initial_code и contents
// TODO: Попытаться получить содержимое с помощью кода first_attempt
// Вывести: "Attempt with {code}: {result}"
// TODO: Изменить код шкафчика на new_code
// Вывести: "Code changed"
// TODO: Попытаться получить содержимое с помощью кода second_attempt
// Вывести: "Attempt with {code}: {result}"
}
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust