Das Debug-Trait
Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy — Lektion 35 von 61.
Rusts Standardbibliothek enthält viele vordefinierte Traits, die gängige Funktionalitäten bereitstellen. Einer der nützlichsten für die Entwicklung ist der Debug-Trait, der es ermöglicht, den Inhalt eines Structs zur Inspektion auszugeben.
Wenn Sie versuchen, eine benutzerdefinierte Struktur direkt auszugeben, weiß Rust nicht, wie sie angezeigt werden soll:
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Fehler! Debug nicht implementiert
Der {:?}-Formatierer benötigt das Debug-Trait. Anstatt es manuell zu implementieren, bietet Rust eine Abkürzung – das #[derive]-Attribut. Platzieren Sie es direkt über Ihrer Struct-Definition:
#[derive(Debug)]
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Player { name: "Alice", score: 100 }
Das #[derive(Debug)]-Attribut weist den Compiler an, automatisch die Debug-Implementierung zu generieren. Dies funktioniert, solange alle Felder in deinem Struct ebenfalls Debug implementieren (was auf die meisten Standardtypen zutrifft).
Für eine besser lesbare Ausgabe bei verschachtelten Strukturen verwende {:#?} für Pretty-Printing:
println!("{:#?}", p);
// Player {
// name: "Alice",
// score: 100,
// }
Das Ableiten von Debug ist während der Entwicklung essenziell – es ermöglicht Ihnen, Ihre Daten schnell zu inspizieren, ohne benutzerdefinierten Formatierungscode schreiben zu müssen.
Aufgabe
EinfachLassen Sie uns Ihre Structs inspizierbar machen, indem wir das Debug-Trait ableiten! Sie werden ein einfaches Inventarsystem erstellen, in dem Elemente zu Debugging-Zwecken ausgegeben werden können.
Sie werden Ihren Code über zwei Dateien organisieren:
inventory.rs: Definieren Sie ein öffentlichesItem-Struct mit zwei öffentlichen Feldern:name(String) undquantity(u32). Verwenden Sie das Attribut#[derive(Debug)], um das Debug-Trait automatisch für Ihr Struct zu implementieren.main.rs: Binden Sie Ihr Inventarmodul ein und erstellen Sie eineItem-Instanz unter Verwendung der bereitgestellten Eingaben. Geben Sie das Element mit dem Debug-Formatierer{:?}aus, um seine interne Struktur anzuzeigen.
Das Schöne am Ableiten von Debug ist, dass Rust den Formatierungscode automatisch für Sie generiert – keine manuelle Implementierung erforderlich! Ihr Struct benötigt lediglich das Attribut und wird mit {:?} ausgebbar.
Ihre Ausgabe sollte das Element im Debug-Format von Rust anzeigen:
Item { name: "{name}", quantity: {quantity} }Zum Beispiel mit den Eingaben Keyboard und 15:
Item { name: "Keyboard", quantity: 15 }Sie erhalten zwei Eingaben: den Namen des Elements und die Menge (parsen als u32).
Probier es selbst
mod inventory;
use inventory::Item;
fn main() {
// Eingabe lesen
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: Erstelle eine Item-Instanz mit dem angegebenen Namen und der Menge
// TODO: Gib das Element mit dem Debug-Formatierer {:?} aus
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Methoden und Verhalten
Einführung in ImplementierungsblöckeDer Self-ParameterVeränderliche MethodenAssoziierte FunktionenMehrere ImplementierungsblöckeMethod ChainingRückblick – Rechteck-Aktionen4Projekt: Virtuelles Haustier
Das Haustier definierenDas Haustier füttern7Standard-Traits
Das Debug-TraitDas Display-TraitClone und CopyGleichheits-TraitsZusammenfassung – Druckbarer Punkt10Projekt: Dokumentensystem
Das Draw-TraitText-Komponente2Kapselung und Module
Grundlagen der ModuleDas Public-SchlüsselwortPrivate FelderGetterSetterWiederholung – Sicherer Tresor5Generics
Generische StructsGenerische MethodenMehrere generische TypenGenerische FunktionenZusammenfassung - Koordinatenpunkt8Traits als Einschränkungen
Syntax für Trait BoundsMehrfache BoundsDie Where-KlauselTypen mit Traits zurückgebenRückblick – Generischer Drucker11Design Patterns in Rust
Newtype-PatternKompositionDas Drop-TraitFrom und IntoZusammenfassung – Smart Pointer Mock3Fortgeschrittene Enums
Enums mit DatenMethoden für EnumsMatching von DatenvariantenDas Option-Enum erneut betrachtetZusammenfassung – Shape-Enum6Definition von Traits
Was ist ein Trait?Traits implementierenStandardimplementierungenStandardimplementierungen überschreibenTraits mit ParameternZusammenfassung – Media Player