
← Andrej Karpathy的RSS订阅清单27. Sept. · 7 Min.
代码检查越多反而越危险?Rust给出新解法
一次校验并不等于全程安全:当函数在确认数据合法后仍返回普通类型,下游代码只能继续重复检查、编写防御分支,甚至留下脆弱的 `unreachable` 断言。本期深度解析 Eli Bendersky 的文章,看看 Rust 如何用精化类型,把“已经验证过”的事实变成整个程序都能信赖的接口契约。
从 `NonEmpty`、`NonZero` 到配置解析与路径类型转换,文章展示了“Parse, don’t validate”的真正含义:边界处的运行时检查仍不可少,但成功后的数据应升级为更精确的类型,让非法状态难以甚至无法被表示。欢迎阅读原文,并结合本期解析理解这种设计如何减少重复检查与潜在崩溃。
原文链接:
https://eli.thegreenplace.net/2026/rusty-thoughts-on-parse-dont-validate/
原文标题:Rusty thoughts on "Parse, don't validate"
主要内容:
• 普通 `Vec` 即使已被检查非空,`first()` 依然返回 `Option`;改用 `NonEmpty` 能将“至少有一个元素”的证明保存在类型中。
• “验证”只产生一次性的执行证据;“解析”则将原始数据转换为表达能力更强的新类型,让下游无需重复确认同一事实。
• 在解析 shell 管道、读取配置、处理路径等场景中,精化类型可让非法状态在抽象语法树和业务接口层面无法出现。
• `PathBuf → Utf8PathBuf → AbsPathBuf` 展示了保证可以逐层累积,但类型只应承诺它实际证明的事实,不能替代文件存在性或权限等动态检查。
• `NonZeroUsize` 不仅消除了除零等不可能错误,Rust 还能利用其无效位模式优化 `Option` 的内存表示。
推荐理由: