使用quote!宏遍历Vec时报ThereIsNoIteratorInRepetition错误的原因
问题原因
该编译报错的核心触发原因是quote!宏的重复插值语法使用错误,你遗漏了重复块内部迭代变量前的#前缀。
语法规则说明
quote!的重复插值固定语法格式为:#( 带前缀的插值内容 )* 可选分隔符,所有需要在迭代过程中展开的集合变量,都必须在重复块内部显式添加#前缀,标识这是需要被迭代访问的集合。
你的代码中写的是#(list);*,list没有加#前缀,quote宏不会将其识别为要迭代的集合,而是当做普通标识符处理,自然无法匹配到所需的迭代器类型,因此抛出了该错误。
修正方案
只需要给重复块内的list加上#前缀即可:
let generated = quote! { fn hello_world() { #(#list);* } };
补充说明
这个看似奇怪的类型报错是quote宏的设计逻辑导致的:宏在处理重复块时,会为每个带#前缀的变量生成对应的迭代器包装类型HasIterator;如果重复块内没有找到任何带#前缀的可迭代变量,就会默认使用ThereIsNoIteratorInRepetition类型,编译时类型校验不通过就会抛出你遇到的错误。
如果需要同步迭代多个集合,只需要将所有要迭代的变量都加上#前缀即可,示例如下:
// 同时迭代a、b两个Vec,每次取对应位置的元素拼接 #(#a + #b)*
内容的提问来源于stack exchange,提问作者reinis_mx
相关产品推荐
相关产品推荐

