← 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 使用一项项目规则来管理依赖项、构建、测试和文档创建。 如果您将错误类型和模块公开范围保持得较小,则用户需要了解的合同也较小。