Podsumowanie — bezpieczna skrytka
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 13 z 61.
Wyzwanie
ŁatwyStwó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ęLockerz dwoma prywatnymi polami:code(u32) icontents(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"
- Konstruktor
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 coinsOtrzymasz 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
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online