RangeFrom 第二篇:我为何认为 Rust 该迭代器设计有问题
来源: erk.dev — 2026-08-30
概述
Rust 的 RangeFrom(n..)迭代器看似简单,作者却从五个预期出发逐一揭示其设计缺陷:溢出时机导致最终值可能被跳过、溢出后可能产生范围外的值、不同实现 Step 的类型溢出行为不一致(有的 panic、有的回绕、有的饱和)、甚至可能永不递增。他通过实测列出 7 种整数/枚举类型在 Debug 与 Release 下的三种迥异行为,认为这些语义混乱是个「foot gun」。作者主张溢出时迭代器应返回 None 并改用 Step::checked_forward,并提议用 enumerate_with 方法替代 zip(1..) 的惯用法。
核心要点
- n.. 溢出时机使最终值 u8::MAX 可能被跳过
- 溢出后可能产生范围外的值,违反范围语义
- 7 种 Step 类型有 panic/回绕/饱和三种迥异行为
- NonZero<u8> 溢出后甚至永不递增
- 作者主张溢出时返回 None,改用 Step::checked_forward
- 提议用 enumerate_with 替代 zip(1..) 惯用法
金句
这个迭代器在 Debug 与 Release 下的行为截然不同,是一把语义不清的雷。
👍 0
👎 0
返回 Lobsters 首页