«найдена структура» ThereIsNoIteratorInRepetition «»при попытке повторить вектор с помощью» цитаты!`

#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 , это означает, что в повторении не было найдено интерполяции, когда я первоначально думал, что это означает, что интерполяция была правильно проанализирована, но не была принята в качестве итератора.