Итоги — Безопасный сейф
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 13 из 61.
Задание
ЛегкоДавайте создадим защищённую систему шкафчика, которая объединит всё, что вы узнали об инкапсуляции! Ваш шкафчик будет защищать своё содержимое с помощью секретного кода: только тот, кто знает код, сможет увидеть, что находится внутри.
Вы создадите два файла, чтобы организовать свой код:
locker.rs: Определите структуруLockerс двумя private полями:code(u32) иcontents(String). Структура должна быть public, но оба поля должны оставаться private, чтобы обеспечить безопасность шкафчика. Реализуйте:- конструктор
new, который принимает initial код и содержимое - метод
set_code, позволяющий изменить код шкафчика - метод
get_contents, который принимает введённый код: если он matches коду шкафчика, вернуть содержимое; в противном случае вернуть"Access denied"
- конструктор
main.rs: Подключите модуль шкафчика, создайте шкафчик и продемонстрируйте его функции безопасности, пытаясь получить доступ к содержимому с правильным и неправильным кодами.
Метод get_contents должен возвращать String: фактическое содержимое, если код правильный, или сообщение об отказе, если код неверный. Это ваш условный геттер, который проверяет доступ перед раскрытием private данных.
Ваш вывод должен соответствовать этому точному формату:
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Вы получите пять входных данных: initial код, содержимое, код первой попытки, новый код для установки и код второй попытки.
Попробуйте сами
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: Попытаться получить contents с кодом first_attempt
// Вывести: "Attempt with {code}: {result}"
// TODO: Изменить код locker на new_code
// Print: "Code changed"
// TODO: Попытаться получить contents с кодом second_attempt
// Вывести: "Attempt with {code}: {result}"
}
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust