Ripasso - Mock con smart pointer
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 58 di 61.
Sfida
FacileCostruiamo un simulatore di puntatore intelligente chiamato SmartBox che dimostra come funzionano dietro le quinte i veri puntatori intelligenti di Rust! Il tuo involucro sarà generico, permetterà di accedere al suo valore interno e annuncerà automaticamente quando viene eliminato.
Organizzerai il codice in due file:
smart_box.rs: definisci una struct generica pubblicaSmartBox<T>con un unico campovaluedi tipoT. Implementa una funzione associatanewche crea uno SmartBox e stampa un messaggio di creazione. Aggiungi un metodogetche restituisce un riferimento al valore interno. Infine, implementa il traitDropper stampare un messaggio di eliminazione quando lo SmartBox esce dall'ambito.main.rs: includi il modulo smart_box e mostra il funzionamento del tuo SmartBox con due tipi diversi. Crea unoSmartBox<i32>che contiene un numero e unoSmartBox<String>che contiene del testo (entrambi ricavati dagli input forniti). Stampa i valori usando il tuo metodoget. I messaggi di Drop appariranno automaticamente quando gli SmartBox usciranno dall'ambito alla fine di main.
Quando viene creato uno SmartBox, deve stampare:
SmartBox createdQuando accedi al valore, stampalo in questo formato:
Value: {value}Quando uno SmartBox viene eliminato, deve stampare:
SmartBox droppedPer esempio, con gli input 42 e Hello:
SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox droppedNota che entrambi gli SmartBox vengono creati per primi, poi si accede ai loro valori e infine vengono eliminati entrambi in ordine inverso (l'ultimo creato è il primo a essere eliminato) quando main termina.
Riceverai due input: un valore intero (da analizzare come i32) e una stringa.
Provalo tu
mod smart_box;
use smart_box::SmartBox;
fn main() {
// Leggi gli input
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let number: i32 = input1.trim().parse().expect("Failed to parse number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let text = input2.trim().to_string();
// TODO: Crea uno SmartBox<i32> che contenga il numero
// TODO: Crea uno SmartBox<String> che contenga il testo
// TODO: Stampa i valori usando il metodo get
// Formato: "Value: {value}"
// I messaggi di Drop appariranno automaticamente al termine di main
}
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