用 Rust 重新审视「解析而非校验」
来源:eli.thegreenplace.net — 39 分 · by ingve
📋 概述
Eli Bendersky 复盘 Alexis King 那篇著名的《Parse, don't validate》,把它放到 Rust 语境下检视,并特别留意 Rust 标准库与知名项目里符合这一模式的示例。文章的核心是对比:`Vec::first` 返回 `Option<&T>`,因为向量不保证非空,这在 Rust 里是惯用做法;但当一个函数在读环境变量配置目录并强制「列表不能为空」这一不变量时,它往往只在函数内部用 ensure! 断言,返回值类型却没有把这个不变量编码进去。调用方拿到的仍是普通的 `Vec<PathBuf>`,下次仍可能传入空列表,这正是「校验而不解析」的典型缺陷。
🔑 核心要点
- 文章是对 Alexis King 的《Parse, don't validate》在 Rust 语境下的复盘,原文用的是 Haskell。
- 引用惯用示例:`Vec::first` 返回 `Option<&T>`,因为向量不保证非空。
- 反例是读取配置路径的函数:内部用 ensure! 断言非空,但返回类型没有编码这一不变量。
- 问题后果清楚:调用方拿到的仍是普通 `Vec`,不变量在类型层面不被保留。
- 作者有意在 Rust 标准库与知名项目中寻找这一模式的教学示例。
💡 金句
「解析而非校验」之所以迷人,是因为它给一个我们熟悉且重要的惯用法起了名字——过去我自己观察和使用过它,却从未明确命名。
👍 0
👎 0
← 返回 Hacker News 首页