Il trait Debug
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 35 di 61.
La libreria standard di Rust include molti trait predefiniti che forniscono funzionalità comuni. Uno dei più utili per lo sviluppo è il trait Debug, che ti permette di stampare il contenuto di una struct per ispezionarlo.
Se provi a stampare direttamente una struct personalizzata, Rust non saprà come visualizzarla:
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // ¡Error! Debug no está implementado
Il formattatore {:?} richiede il trait Debug. Invece di implementarlo manualmente, Rust offre una scorciatoia: l'attributo #[derive]. Inseriscilo direttamente sopra la definizione della struct:
#[derive(Debug)]
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Player { name: "Alice", score: 100 }
L'attributo #[derive(Debug)] dice al compilatore di generare automaticamente l'implementazione di Debug. Funziona purché tutti i campi della tua struct implementino anche Debug (come avviene per la maggior parte dei tipi standard).
Per ottenere un output più leggibile con strutture annidate, usa {:#?} per la formattazione elegante:
println!("{:#?}", p);
// Player {
// name: "Alice",
// score: 100,
// }
Derivare Debug è essenziale durante lo sviluppo. Ti permette di esaminare rapidamente i tuoi dati senza scrivere codice di formattazione personalizzato.
Sfida
FacileRendiamo ispezionabili le tue struct derivando il trait Debug! Creerai un semplice sistema di inventario in cui gli articoli possono essere stampati a scopo di debug.
Organizzerai il codice in due file:
inventory.rs: Definisci una struct pubblicaItemcon due campi pubblici:name(String) equantity(u32). Usa l’attributo#[derive(Debug)]per implementare automaticamente il trait Debug per la tua struct.main.rs: Includi il modulo inventory e crea un’istanza diItemusando gli input forniti. Stampa l’articolo usando il formattatore di debug{:?}per visualizzarne la struttura interna.
Il bello di derivare Debug è che Rust genera automaticamente il codice di formattazione per te: non serve alcuna implementazione manuale! Alla tua struct basta l’attributo per poter essere stampata con {:?}.
Il tuo output dovrebbe mostrare l’articolo nel formato di debug di Rust:
Item { name: "{name}", quantity: {quantity} }Ad esempio, con gli input Keyboard e 15:
Item { name: "Keyboard", quantity: 15 }Riceverai due input: il nome dell’articolo e la quantità (da analizzare come u32).
Provalo tu
mod inventory;
use inventory::Item;
fn main() {
// Leggi l'input
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut quantity_str = String::new();
std::io::stdin().read_line(&mut quantity_str).expect("Failed to read line");
let quantity: u32 = quantity_str.trim().parse().expect("Failed to parse quantity");
// TODO: Crea un'istanza di Item con il nome e la quantità forniti
// TODO: Stampa l'elemento usando il formattatore di debug {:?}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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