← SEARCHABLE ARCHIVE
Rust · 2026-08-06

Rust 從基礎到精通 — 第 7 講

使用結果、模組和貨物管理錯誤和項目

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

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 使用專案規則來管理相依性、建置、測試和文件建立。 如果您將錯誤類型和模組公開範圍保持較小,則使用者需要了解的合約也較小。