Menu
Coddy logo textTech

Итоги — Безопасный сейф

Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 13 из 61.

challenge icon

Задание

Легко

Давайте создадим защищённую систему шкафчика, которая объединит всё, что вы узнали об инкапсуляции! Ваш шкафчик будет защищать своё содержимое с помощью секретного кода: только тот, кто знает код, сможет увидеть, что находится внутри.

Вы создадите два файла, чтобы организовать свой код:

  • 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}"
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Rust