一种比「组件之和」更强的类型
来源: schneems.com — 2026-09-24
概述
作者把一个有 N 个变体的枚举拆成 N 个类型,方法朴素但让他回味良久:std::path::Component 是个和类型,但接受「任意一种组件」的函数签名过于宽泛,于是他给每个变体做了自有 struct。这样 join_normal 可以接收保证来自 Component::Normal 的 NormalComponent,「把某个东西接到绝对路径后面仍然是绝对路径」就由类型系统保证,而不必接受可能是 .. 或本身是绝对路径的 OsStr。
核心要点
- 把 std::path::Component 这个和类型拆成每个变体一个自有 struct。
- join_normal 接收 NormalComponent 后,可以保证拼接结果仍是绝对路径。
- 原先的签名接收 OsStr,可能含 .. 或本身就是绝对路径,join 时会把目标整个替换掉。
- 作者此前已有 AbsPath、RelativePath、CanonicalPath 等类型,但仍嫌宽泛。
- 路径同时表达词法值与物理位置,二者可能不一致,规范化会带来意外后果。
- Windows 上以 \\?\ 开头的路径会把 . 与 .. 当字面值处理,是额外的坑。
金句
如果一个「N 选一」的和类型有用,那么其中每一个具体的分量多半也值得成为独立的类型。
👍 0
👎 0
← 返回 Lobsters 首页