Rust von den Grundlagen bis zum Profi — Folge 7
Verwalten Sie Fehler und Projekte mit Ergebnis, Modulen und Fracht
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.
Rust gibt behebbare Fehler als Ergebnis an. Wenn das Projekt wächst, werden Modulgrenzen, Ladungseinstellungen und Tests sowie Fehlertypen Teil des Codevertrags.
Ergebnis- und Fragezeichenoperatoren
use std::fs;
use std::io;
fn load_config(path: &str) -> Result<String, io::Error> {
let text = fs::read_to_string(path)?;
Ok(text)
}
? entnimmt den inneren Wert, wenn es sich um einen Erfolgswert handelt, und gibt einen Fehler von der aktuellen Funktion zurück, wenn diese fehlschlägt. Es handelt sich nicht um eine Grammatik, die Fehler ignoriert, sondern um einen kurzen Ausdruck, der dem Aufrufer übermittelt wird.
Kontext zu Fehlern hinzufügen
fn parse_level(text: &str) -> Result<u32, String> {
text.trim()
.parse::<u32>()
.map_err(|error| format!("invalid level: {error}"))
}
Die Bibliothek kann Fehler zurückgeben, die der Aufrufer bearbeiten kann, und sie an Programmgrenzen in Protokolle oder Benutzermeldungen umwandeln. Wenn Sie aufgrund eines vorhersehbaren Eingabefehlers in Panik geraten, verlieren Sie die Chance auf eine Wiederherstellung.
Festlegen des öffentlichen Bereichs mit Modulen
mod combat {
pub struct Damage(pub u32);
pub fn calculate(attack: u32, defense: u32) -> Damage {
Damage(attack.saturating_sub(defense).max(1))
}
}
Grundlegende Elemente sind nur Modulen ausgesetzt und es können nur Verträge mit pub verwendet werden. Durch das Ausblenden der internen Implementierung verringert sich der Spielraum für Änderungen, die sich auf andere Module ausbreiten.
Ladung und Prüfung
#[cfg(test)]
mod tests {
use super::combat;
#[test]
fn damage_is_at_least_one() {
assert_eq!(combat::calculate(5, 100).0, 1);
}
}
Cargo verwaltet Abhängigkeiten, Builds, Tests und Dokumenterstellung mit einer Projektregel. Wenn Sie den Fehlertyp und den Offenlegungsumfang des Moduls klein halten, ist auch der Vertrag, den der Benutzer kennen muss, kleiner.