Rust von den Grundlagen bis zum Profi — Folge 4
Gültige Zustände mit Strukturen und Aufzählungen ausdrücken
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Strukturen gruppieren verwandte Daten und Aufzählungen listen mögliche Zustände auf. Wenn Sie die beiden zusammen verwenden, müssen Sie nicht zwangsweise Kombinationen ausdrücken, die mit Feldern und Bools nicht existieren können.
Struktur und Impl
struct Player {
name: String,
health: i32,
}
impl Player {
fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
health: 100,
}
}
fn take_damage(&mut self, amount: i32) {
self.health = (self.health - amount.max(0)).max(0);
}
}
Der Impl-Block definiert Erstellungsfunktionen und -methoden im Zusammenhang mit der Struktur. &mut self bedeutet, dass die Methode ausschließlich Kredite aufnimmt, um das Objekt zu ändern.
Zustand mit Enumeration ausdrücken
enum QuestState {
Locked,
Active { progress: u32, goal: u32 },
Completed { reward_claimed: bool },
}
Es gibt nur einen Fortschritt, wenn es aktiv ist, und den Erhalt einer Belohnung nur, wenn es abgeschlossen ist. Ungültige Kombinationen werden im Vergleich zum Ausdrücken derselben Informationen mit mehreren Bool- und Nullable-Feldern reduziert.
Mustervergleich
fn describe(state: &QuestState) -> String {
match state {
QuestState::Locked => String::from("Locked"),
QuestState::Active { progress, goal } => {
format!("{progress}/{goal}")
}
QuestState::Completed { reward_claimed: true } => {
String::from("Reward claimed")
}
QuestState::Completed { reward_claimed: false } => {
String::from("Reward ready")
}
}
}
match prüft, ob alle Fälle der Aufzählung verarbeitet wurden. Das Hinzufügen eines neuen Status führt dazu, dass unverarbeiteter Code als Kompilierungsfehler angezeigt wird.
Option und Ergebnis sind ebenfalls dieselbe Aufzählung. In Rust werden Zustände und Fehlermöglichkeiten als Typen ausgedrückt und jeder Fall wird mithilfe von Übereinstimmungen oder dedizierten Methoden behandelt.