Menu
Coddy logo textTech

Podsumowanie — bezpieczna skrytka

Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 13 z 61.

challenge icon

Wyzwanie

Łatwy

Stwórzmy bezpieczny system skrytek, który wykorzystuje wszystko, czego nauczyłeś się o enkapsulacji! Twoja skrytka będzie chronić swoją zawartość za pomocą tajnego kodu: tylko osoba, która zna kod, może zobaczyć, co jest w środku.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • locker.rs: Zdefiniuj strukturę Locker z dwoma prywatnymi polami: code (u32) i contents (String). Struktura powinna być publiczna, ale oba pola muszą pozostać prywatne, aby chronić bezpieczeństwo skrytki. Zaimplementuj:
    • Konstruktor new, który przyjmuje początkowy kod i zawartość
    • Metodę set_code, która umożliwia zmianę kodu skrytki
    • Metodę get_contents, która przyjmuje podany kod: jeśli pasuje do kodu skrytki, zwróć zawartość; w przeciwnym razie zwróć "Access denied"
  • main.rs: Wczytaj moduł skrytki, utwórz skrytkę i zademonstruj jej funkcje bezpieczeństwa, próbując uzyskać dostęp do zawartości za pomocą poprawnych i niepoprawnych kodów.

Metoda get_contents powinna zwracać String: rzeczywistą zawartość, gdy kod jest poprawny, albo komunikat o odmowie dostępu, gdy kod jest niepoprawny. To Twój warunkowy getter, który weryfikuje dostęp, zanim ujawni prywatne dane.

Wynik powinien mieć dokładnie następujący format:

Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}

Na przykład, jeśli utworzysz skrytkę z kodem 1234 i zawartością "Gold coins", następnie spróbujesz użyć kodu 0000, zmienisz kod na 5678 i spróbujesz użyć 5678, wynik będzie wyglądał tak:

Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coins

Otrzymasz pięć danych wejściowych: początkowy kod, zawartość, kod użyty przy pierwszej próbie, nowy kod do ustawienia oraz kod użyty przy drugiej próbie.

Spróbuj swoich sił

mod locker;

use locker::Locker;

fn main() {
    // Odczytaj dane wejściowe
    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: Utwórz nowy Locker z initial_code i contents

    // TODO: Spróbuj pobrać contents za pomocą kodu first_attempt
    // Wypisz: "Attempt with {code}: {result}"

    // TODO: Zmień kod schowka na new_code
    // Wypisz: "Code changed"

    // TODO: Spróbuj pobrać contents za pomocą kodu second_attempt
    // Wypisz: "Attempt with {code}: {result}"
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Rust online