Riepilogo - Armadietto sicuro
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 13 di 61.
Sfida
FacileCostruiamo un sistema di armadietto sicuro che riunisce tutto ciò che hai imparato sull'incapsulamento! Il tuo armadietto proteggerà il suo contenuto con un codice segreto: solo chi conosce il codice può vedere cosa c'è dentro.
Creerai due file per organizzare il tuo codice:
locker.rs: Definisci una structLockercon due campi privati:code(u32) econtents(String). La struct deve essere pubblica, ma entrambi i campi devono rimanere privati per proteggere la sicurezza dell'armadietto. Implementa:- Un costruttore
newche accetta un codice iniziale e un contenuto - Un metodo
set_codeche consente di cambiare il codice dell'armadietto - Un metodo
get_contentsche accetta un codice tentato; se corrisponde al codice dell'armadietto, restituisce il contenuto; altrimenti, restituisce"Access denied"
- Un costruttore
main.rs: Importa il modulo dell'armadietto, crea un armadietto e mostra le sue funzionalità di sicurezza provando ad accedere al contenuto con codici corretti e non corretti.
Il metodo get_contents deve restituire una String, che contiene il contenuto effettivo quando il codice è corretto oppure il messaggio di accesso negato quando è errato. Questo è il tuo getter condizionale, che convalida l'accesso prima di rivelare i dati privati.
L'output deve seguire esattamente questo formato:
Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}Per esempio, se crei un armadietto con il codice 1234 e il contenuto "Gold coins", poi provi il codice 0000, cambi il codice in 5678 e provi 5678, l'output sarà:
Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coinsRiceverai cinque input: il codice iniziale, il contenuto, il codice del primo tentativo, il nuovo codice da impostare e il codice del secondo tentativo.
Provalo tu
mod locker;
use locker::Locker;
fn main() {
// Leggi gli input
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: Crea un nuovo Locker con initial_code e contents
// TODO: Prova a ottenere contents usando il codice first_attempt
// Stampa: "Attempt with {code}: {result}"
// TODO: Cambia il codice del locker in new_code
// Stampa: "Code changed"
// TODO: Prova a ottenere contents usando il codice second_attempt
// Stampa: "Attempt with {code}: {result}"
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online