Как обработать `Self` в процедурных макросах Rust?

Я пытаюсь создать производный макрос в Rust для создания экземпляров, в качестве примера, который должен реализовать следующую черту:

pub trait MyTrait {
    fn my_default() -> Option<Self>;
}

я использую syn а также quote проанализировать и сгенерировать AST следующим образом:

#[proc_macro_derive(MyTrait)]
pub fn my_default_derive(input: TokenStream) -> TokenStream {
    // Use `syn` to parse
    // ...

    let gen = quote! {
        impl #impl_generics_strait::MyTrait for #name #ty_generics #where_clause {
            fn my_default() -> Option<Self>{
                // ...
            }
        }
    };

    gen.into()
}

Поскольку компилятор не знает, что Self во время компиляции, вышесказанное приведет к ошибке:

the size for values of type `Self` cannot be known at compilation time

Мои вопросы:

  • Можно ли использовать Self в proc_macro_derive?
  • Как?

Кстати, я пытаюсь использовать Ident вместо этого, и опубликую прогресс здесь позже.

Обновление:

  • Оказывается, ошибка вызвана объявлением черты, а не proc_macro_derive, Чинить, Sized следует добавить к имени черты.

0 ответов

Другие вопросы по тегам