7

自分の特性にカスタム派生マクロを実装しようとしていますが、実際に機能します!

ただし、少し問題があります。ジェネリック パラメーターをトレイトに含める方法が見つからないようです。

具体的には、次のようなことをしたい:#[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
            }
            ...
}

ご覧のとおり、'aV、および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
           } ...
4

1 に答える 1