前提
まず、ここではRust book のMacroのページを参考にさせてください。
例ではまず以下のようなtraitがあって
src/lib.rs
rust
1pub trait HelloMacro { 2 fn hello_macro(); 3}
以下のderiveマクロを作成しています。
hello_macro_derive/src/lib.rs
rust
1extern crate proc_macro; 2 3use proc_macro::TokenStream; 4use quote::quote; 5use syn; 6 7#[proc_macro_derive(HelloMacro)] 8pub fn hello_macro_derive(input: TokenStream) -> TokenStream { 9 let ast = syn::parse(input).unwrap(); 10 11 impl_hello_macro(&ast) 12} 13 14fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream { 15 let name = &ast.ident; 16 let gen = quote! { 17 impl HelloMacro for #name { 18 fn hello_macro() { 19 println!("Hello, Macro! My name is {}!", stringify!(#name)); 20 } 21 } 22 }; 23 gen.into() 24}
質問
ここで、例えばこのマクロの中で、
rust
1fn hello_macro() {hoge}
となっている部分を
rust
1fn hello_macro() -> #name {hoge}
としたのですが、この場合元のtraitのほうでの戻り値と整合性が取れていないためエラーとなりました。しかしtrait定義の方では、実装先の構造体の名前である#nameを使うことはできません。
この場合このようなマクロ(メソッドの戻り値を動的に構造体にする)を作るのは不可能なのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/06 05:20
2021/10/06 05:43
2021/10/06 07:31