DevCN
菜单
全部文章快讯开发科技深度热点

Rust Result:解析时长并区分格式与范围错误

用 Result 编写分钟数解析函数,借助问号传播错误,再用 match 显式处理每条输入的成功与失败。


本节目标

用 Result 编写分钟数解析函数,借助问号传播错误,再用 match 显式处理每条输入的成功与失败。

环境与运行方法

保存为 lesson.rs,使用 Rust 工具链执行 rustc --edition=2021 lesson.rs -o lesson,然后运行 ./lesson。代码也可放进 Cargo 项目的 src/main.rs。

核心思路

格式错误和超过业务上限属于不同失败原因。Result 将这种分支写在类型里。本例以固定字符串表示错误;更大的应用可以使用专门枚举,避免到处比较字符串。

完整示例

fn minutes(text: &str) -> Result<u32, &'static str> {
    let value = text.parse::<u32>().map_err(|_| "format")?;
    if value > 1440 { return Err("range"); }
    Ok(value)
}
fn main() {
    for input in ["45", "x", "1441", "0"] {
        match minutes(input) {
            Ok(value) => println!("ok={}", value),
            Err(reason) => println!("error={}", reason),
        }
    }
}

预期输出

ok=45
error=format
error=range
ok=0

逐步理解

parse 尝试转换为 u32,map_err 转换错误表达,问号在失败时提前返回。成功解析后仍需限制 1440,因为类型允许的范围远大于一天的分钟数。

match 覆盖两个分支,坏输入不会触发 unwrap 引起的 panic。本例不自动 trim,首尾空白不被接受;是否清洗空白应由输入契约决定。返回零不是错误的合适替代,因为零本身合法。

常见问题与边界

  • unwrap 不适合作为用户输入错误的默认处理。
  • 无符号类型拒绝负数,但不能代替业务上限检查。
  • 统一吞掉错误会失去逐条报告原因的能力。

动手练习

增加 "1440"、"-1" 和空字符串。

参考答案

1440 合法;负数与空字符串都无法解析成 u32,得到 format。如果需要把负数分成独立业务错误,应改为先解析有符号类型。

下载推广海报

文章推广海报

《Rust Result:解析时长并区分格式与范围错误》完整推广海报
DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。