三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Rust 所有权与生命周期从入门到实战:上线前补齐校验、观测与回退

Rust 所有权与生命周期从入门到实战:上线前补齐校验、观测与回退

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()是否有数据所有权上的理由,而不是为了让编译器安静下来。
  • 边界输入和错误分支是否有测试。
  • 公开错误信息里不包含路径、账号、令牌或业务内容。

这些检查不保证代码没有问题,但能让我在把练习代码继续扩展前,先看见比较明显的坑。

← 返回列表