Menu
Coddy logo textTech

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

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 13 из 61.

challenge icon

Задание

Легко

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

Вы создадите два файла для организации своего кода:

  • 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