Rust 所有权与生命周期从入门到实战:上线前补齐校验、观测与回退
我写练习原型时也会用 unwrap(),方便先看主流程。但它不是“原型允许、正式代码禁止”这么简单:有些场景在证明不变量后可以使用,有些公共入口则必须把失败交给调用方处理。重点是知道边界在哪里,并用测试把它守住。
把一个小原型整理成可用功能时,我通常先做三件事:写清输入是否可空、把错误信息放进返回值、再看 clone 是不是真的需要。性能优化放在能测到瓶颈之后,不为了避开借用检查器先堆一层 clone。
use anyhow::{Context, Result};
fn normalize_name(input: Option<&str>) -> Result<String> {
let input = input.context("名称不能为空")?;
let input = input.trim();
if input.is_empty() {
anyhow::bail!("名称不能为空白");
}
if input.len() > 128 {
anyhow::bail!("名称过长");
}
Ok(input.to_uppercase())
}
#[test]
fn rejects_empty_name() {
assert!(normalize_name(Some(" ")).is_err());
}
我自己的验收清单
- 公共函数的失败路径是否能被调用方理解和处理。
clone()是否有数据所有权上的理由,而不是为了让编译器安静下来。- 边界输入和错误分支是否有测试。
- 公开错误信息里不包含路径、账号、令牌或业务内容。
这些检查不保证代码没有问题,但能让我在把练习代码继续扩展前,先看见比较明显的坑。

5224

被折叠的 条评论
为什么被折叠?



