常见误区与排错
报错位置
宏展开后,类型错误可能出现在「展开体」的某一行;编译器通常会关联到宏调用处。若信息令人困惑,可暂时把宏调用改写成展开后的等价手写代码,缩小问题范围。
类型与能力不满足
filter!:元素类型须能drop,否则无法丢弃筛除项。destroy!:常用于元素无drop时逐枚销毁;需保证 lambda 确实消费每个元素。- Lambda 体:展开后仍受借用 checker 约束;可变与不可变遍历不要混用违反规则的写法。
何时不用宏
- 逻辑只出现一次、展开后反而不直观时,手写更清晰。
- 需要作为函数值传递时,Move 没有「宏指针」——应使用普通
fun或设计数据结构。
小结
宏是强类型的语法变换,不是万能胶水。遇到诡异错误时,优先怀疑:展开后的类型、所有权、能力约束。最后一节给出简明选型表。