我试图在 Rust 中创建一个派生宏来创建实例,例如,它应该实现以下特征:
pub trait MyTrait {
fn my_default() -> Option<Self>;
}
我使用syn
andquote
来解析和生成 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,稍后会在此处发布进度。
更新:
- 事实证明,错误是由 trait 声明引起的,而不是
proc_macro_derive
. 要修复,Sized
应添加到特征名称。