Итоги — Безопасный сейф
Часть раздела 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