Rust 從基礎到精通 — 第 7 講
使用結果、模組和貨物管理錯誤和項目
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
Rust 將可恢復的故障表示為 Result。 隨著專案的成長,模組邊界、貨物設定和測試以及錯誤類型將成為程式碼契約的一部分。
結果和問號運算符
use std::fs;
use std::io;
fn load_config(path: &str) -> Result<String, io::Error> {
let text = fs::read_to_string(path)?;
Ok(text)
}
? 如果是成功值則取出內部值,如果失敗則從目前函數傳回錯誤。 它不是忽略錯誤的語法,而是傳遞給呼叫者的簡短表達式。
為錯誤添加上下文
fn parse_level(text: &str) -> Result<u32, String> {
text.trim()
.parse::<u32>()
.map_err(|error| format!("invalid level: {error}"))
}
該函式庫可以傳回錯誤供呼叫者處理,在程式邊界將它們轉換為日誌或使用者訊息。 如果您因可預見的輸入錯誤而恐慌,您將失去恢復的機會。
使用模組設定公共範圍
mod combat {
pub struct Damage(pub u32);
pub fn calculate(attack: u32, defense: u32) -> Damage {
Damage(attack.saturating_sub(defense).max(1))
}
}
基礎項只暴露給模組,只能使用pub的合約。 隱藏內部實作可以減少變更傳播到其他模組的範圍。
貨物和測試
#[cfg(test)]
mod tests {
use super::combat;
#[test]
fn damage_is_at_least_one() {
assert_eq!(combat::calculate(5, 100).0, 1);
}
}
Cargo 使用專案規則來管理相依性、建置、測試和文件建立。 如果您將錯誤類型和模組公開範圍保持較小,則使用者需要了解的合約也較小。