Как обработать `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
следует добавить к имени черты.