#rust #rust-macros
Вопрос:
Я пытаюсь создать a Vec
из TokenStream
s, а затем использовать этот список в другом quote!
макросе:
let list: Vec<_> = some_data
.iter()
.map(
|item| {
quote!{/*...*/}
},
)
.collect();
let generated = quote! {
fn hello_world() {
#(list);*
}
};
Однако при компиляции я получаю эту ошибку:
expected struct `HasIterator`, found struct `ThereIsNoIteratorInRepetition`
Из документации макроса следует, что это TokenStream
должно быть допустимо при интерполяции, поскольку оно реализует ToTokens
признак. Кроме того, список-это a Vec
, который также явно разрешается использовать в интерполяции цикла.
Почему я получаю ThereIsNoIteratorInRepetition
ошибку, когда я явно использую допустимый итератор?
Ответ №1:
#(list);*
Должно быть
#(#list);*
Я пропустил внутреннюю интерполяцию #
в интерполяции повторения, и это сводило меня с ума в течение нескольких часов. Оставляю это здесь на случай, если кто-нибудь столкнется с тем же самым.
Я полагаю ThereIsNoIteratorInRepetition
, это означает, что в повторении не было найдено интерполяции, когда я первоначально думал, что это означает, что интерполяция была правильно проанализирована, но не была принята в качестве итератора.