我正在尝试为我的特征实现自定义派生宏,它们确实有效!
但是我有一个小问题。我似乎找不到将通用参数包含到特征的方法。
具体来说,我想做这样的事情:#[derive(MyCustomDerive<'a, B, C>)]
相反,现在我正在对泛型进行硬编码,如下所示:
let gen = quote! {
impl #impl_generics Graph<'a, V, E> for #name #ty_generics #where_clause {
fn Map(&self) -> &MAP<V, E> {
&self.map
}
...
}
如您所见,我将'a、V和E固定在引用块中,而不是我想要实现的东西,它能够灵活地用我想要的泛型类型派生特征。
我想要的是类似于这样的东西:
#[derive(MyCustomDerive<'a, B, C>)]
产生与此等价的东西
let gen = quote! {
impl #impl_generics Graph<'a, B, C> for #name #ty_generics #where_clause {
fn Map(&self) -> &MAP<B, C> {
&self.map
}
...
}
这将允许我保留(当然如果有必要)V 和 E 用于其他事情,并且在我看来使代码更可控。感谢您的帮助!
更新 1:这就是我的派生函数的外观
pub fn derive(ast: &syn::DeriveInput) -> TokenStream {
let name = &ast.ident;
let generics = &ast.generics;
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
let gen = quote! {
impl #impl_generics Graph<'a, V, E> for #name #ty_generics #where_clause {
fn Map(&self) -> &MAP<V, E> {
&self.map
} ...