Rust 里的“Parse, don’t validate”,让类型替下游记住不变量
“Parse, don’t validate”的核心是:不要验证一次输入后仍把它当普通字符串或数组传下去,而应返回一个只能在满足条件时构造的类型。一篇 Rust 工程文章用 NonEmpty、绝对路径封装和标准库 NonZero 类型说明,类型可以替调用者长期保存“不为空”“是绝对路径”等保证。
作者:林岚|OC 开发者生态编辑
“Parse, don’t validate”的核心是:不要验证一次输入后仍把它当普通字符串或数组传下去,而应返回一个只能在满足条件时构造的类型。一篇 Rust 工程文章用 NonEmpty、绝对路径封装和标准库 NonZero 类型说明,类型可以替调用者长期保存“不为空”“是绝对路径”等保证。
一句话结论:把校验结果编码进类型,可以消灭重复检查和无效状态,但只有真正影响正确性的约束值得变成新类型。
普通 Vec<T> 即使刚检查过非空,下一个函数的签名也看不出来;它仍可能再次判断,或者在重构后忘记判断。解析函数若返回 NonEmpty<T>,后续 API 就能把“至少一个元素”当成编译期契约。uutils coreutils 与 rust-analyzer 中的实际用法说明,这不是纯理论技巧。

代价是更多类型、转换和泛型边界。把每条业务规则都做成封装会让代码难读,外部数据变化时也可能造成层层迁移。合适的判断标准是:这个不变量是否跨越多个模块、违反时是否严重、能否在入口一次确定。
关键事实
- 来源:Eli Bendersky 工程文章
- 涉及项目:Rust 标准库、uutils coreutils、rust-analyzer
- 核心技术:精化类型、构造器、
NonZero、绝对路径类型 - 关键数字:无
OC 判断
这条原则的价值是减少“靠注释记住”的状态。先从高风险边界使用,而不是给每个字符串套壳,才能让类型系统减负而不是增负。
为什么重要
- 对开发者:函数签名能传递已经验证过的事实。
- 对企业:关键不变量在编译期暴露,减少重构后的回归。
- 对用户:输入错误更早出现,运行中的意外失败更少。
评论
围绕这篇文章补充信息、提出问题或分享观察。