用真实运行验证 HashSet 与去重:insert/remove 返回 bool、集合运算、保序去重与 sort+dedup 的区别(dedup 只去相邻重复);100 万元素去重三种方式 11.3/11.66/15.18 ms;自定义类型 Eq 与 Hash 不一致时,12 次运行 len 得到 3 种结果。
用真实运行验证 Iterator 的惰性:只 map 不消费时闭包不执行(unused_must_use 警告);inspect/filter/map 链逐元素交错执行;take/find/any/take_while 短路时源只产出 9/7/101/5/4 个元素;无穷序列可用;链类型是嵌套结构体、100 万元素上的链仅 16 字节;代价是借用必须活到消费(E0597)与副作用时机延后。
用真实运行验证 map、filter、fold:map 改变元素类型、iter().filter 的参数是 &&i32(直接取余报 E0369);filter_map 与 flatten 丢弃失败项、collect 成 Result 则整体失败;fold 累加器类型自由、顺序影响结果(48 对 24)、reduce 对空序列返回 None;try_fold 短路;aarch64 汇编里 fold 与 for 循环(60 对 65 条指令)都向量化。
collect 的目标类型必须能从上下文确定,否则 E0283;三种给类型的方式;HashMap/BTreeSet/String/Box<[T]>/Result/Option 等目标;collect 成 Result 在第一个 Err 就停止(5 个元素只调用 3 次);重复键在 BTreeMap 里后者覆盖;size_hint 决定预分配:map 0 次 realloc,filter 11 次。
用真实运行验证 flat_map:等价于 map + flatten,Option/Result 可当作 0 或 1 个元素展开;内层闭包借用外层变量报 E0373 要加 move;take(7) 只创建 4 个内层迭代器;flatten 的 size_hint 是 (0, None);100 万个元素展平求和 flat_map 0.154 ms 对双重 for 0.156 ms。
peek 会从源里拉出一个元素缓存(创建时 0 个、peek 后 1 个,再 peek 不再拉),next 先吐缓存;持有 peek 引用时 next 报 E0499;用 next_if 写词法分析不误吃分隔符,take_while 则吃掉了第一个不满足的元素;inspect 只读观察(修改报 E0594),并印证逐元素交错执行。
用真实测量验证 Iterator 链的性能:release 下 1000 万个元素链 2.724 ms 对 for 循环 2.725 ms 几乎相同;debug 下链约慢 2.1 倍;opt-level=1 起追平;写成中间 Vec 要 15.15 ms(约 5.6 倍)且产生 16 次分配。
用 -Z unpretty=hir 看 for 循环的真实展开:match into_iter(v) { mut iter => loop { match next(&mut iter) { None => break, Some(x) => … } } };手写展开与 for 行为相同(含 break/continue);into_iter 调用 1 次、next 调用 4 次;遍历时 push 报 E0502;range 上界只求值一次。
用真实运行对比 sort 与 sort_unstable:稳定性(sort_unstable 真的打乱了相同 key 的顺序);分配(sort_unstable 不分配,sort 在 513 个 u64 起分配);100 万个随机 u64 sort 14.313 ms 对 sort_unstable 11.198 ms;sort_by_key 调用 20898 次 key 函数而 sort_by_cached_key 只调用 1000 次;f64 需用 total_cmp。
用真实运行验证 BinaryHeap:默认最大堆、into_vec/iter 只是堆序数组、Reverse 做最小堆;相同优先级不保证 FIFO,加 seq 修复;peek_mut 离开作用域才重排;比较次数 n=100000 时 push 228034、from(vec) 188028、全部 pop 1534578;Dijkstra 实例。
用真实运行验证 ? 的传播行为:成功取值、失败立刻 return;只能用在返回 Result/Option 的函数(E0277);错误类型不同需要 From(缺少时 E0277);成功路径不调用 From;Option 的 ? 与 ok_or;main 返回 Err 时退出码 1。
用 -Z unpretty=hir 看 ? 的真实展开:match branch(expr) { Break(residual) => return from_residual(residual), Continue(val) => val },Result 与 Option 形状相同;From::from 藏在 from_residual 里,手写版本结果一致,成功路径不调用;闭包里的 ? 只返回闭包;Box<dyn Error> 接住不同错误。