RUST 函数 · 错误传播

问号不是“忽略错误”

它更像函数出口旁的一名分流员:遇到 Ok 就拆箱放行,遇到 Err 就立刻把错误送回调用者,后面的代码不再执行。

fn parse_and_half(s: &str) -> Result<i32, String> {
    let n: i32 = s.parse()
        .map_err(|_| "无法解析整数".to_string())?;
    if n % 2 != 0 { return Err("不是偶数".into()); }
    Ok(n / 2)
}

① 收到参数

s: &str

函数先拿到调用者给的文本。

等待

② parse + ?

Result<i32, _>

成功就从 Ok 里取出整数;失败则立即返回 Err。

等待

③ 偶数检查

n % 2 == 0

这是业务规则,与解析是否成功是两回事。

等待

④ 构造成功值

Ok(n / 2)

只有前两道关都通过,才会走到这里。

等待
尚未运行

按“开始”后,每次前进一步;留意哪一段代码没有机会执行。

要记住的契约:包含 ? 的表达式产生成功值,或者让整个函数提前返回。它不会把错误吞掉,也不会偷偷给你一个默认值。