"found struct `ThereIsNoIteratorInRepetition`" 尝试使用 `quote!` 重复向量时
"found struct `ThereIsNoIteratorInRepetition`" when trying to repeat over a vector using `quote!`
我正在尝试创建 Vec
个 TokenStream
的列表,然后在另一个 quote!
宏中使用该列表:
let list: Vec<_> = some_data
.iter()
.map(
|item| {
quote!{/*...*/}
},
)
.collect();
let generated = quote! {
fn hello_world() {
#(list);*
}
};
然而,在编译时,我收到了这个错误:
expected struct `HasIterator`, found struct `ThereIsNoIteratorInRepetition`
从 the macro's documentation 看来 TokenStream
应该在插值中有效,因为它实现了 ToTokens
特性。另外,列表是一个Vec
,也明确允许在循环插值中使用。
为什么明明在使用有效的迭代器时却出现 ThereIsNoIteratorInRepetition
错误?
#(list);*
应该是
#(#list);*
我错过了重复插值中的内部插值 #
,这让我疯狂了好几个小时。把它留在这里以防有人遇到同样的事情。
我猜ThereIsNoIteratorInRepetition
的意思是在repetition中没有找到插值,当我原本以为是插值被正确解析,但没有被接受为迭代器。
我正在尝试创建 Vec
个 TokenStream
的列表,然后在另一个 quote!
宏中使用该列表:
let list: Vec<_> = some_data
.iter()
.map(
|item| {
quote!{/*...*/}
},
)
.collect();
let generated = quote! {
fn hello_world() {
#(list);*
}
};
然而,在编译时,我收到了这个错误:
expected struct `HasIterator`, found struct `ThereIsNoIteratorInRepetition`
从 the macro's documentation 看来 TokenStream
应该在插值中有效,因为它实现了 ToTokens
特性。另外,列表是一个Vec
,也明确允许在循环插值中使用。
为什么明明在使用有效的迭代器时却出现 ThereIsNoIteratorInRepetition
错误?
#(list);*
应该是
#(#list);*
我错过了重复插值中的内部插值 #
,这让我疯狂了好几个小时。把它留在这里以防有人遇到同样的事情。
我猜ThereIsNoIteratorInRepetition
的意思是在repetition中没有找到插值,当我原本以为是插值被正确解析,但没有被接受为迭代器。