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

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