我已阅读this documentation page,但我仍然无法弄清楚如何执行此操作。
我的档案是:
|- pancakes.rs
|- main.rs
我在" pancakes.rs"中得到结构Pancakes
:
#[derive(HelloWorld)]
struct Pancakes;
我从文档中复制了以下实现,但ident
不包含完整的"命名空间":
#[proc_macro_derive(HelloWorld)]
pub fn hello_world(input: TokenStream) -> TokenStream {
let s = input.to_string();
let ast = syn::parse_derive_input(&s).unwrap();
let gen = impl_hello_world(&ast);
gen.parse().unwrap()
}
fn impl_hello_world(ast: &syn::DeriveInput) -> quote::Tokens {
let name = &ast.ident; // <---- HERE name = Pancakes, not pancakes::Pancakes
quote! {
impl HelloWorld for #name {
fn hello_world() {
println!("Hello, World! My name is {}", stringify!(#name));
}
}
}
}
是否有可能获得有关结构的所有信息?我还希望从使用派生的地方获取货物的名称。
答案 0 :(得分:3)
这是不可能的。自定义派生工作在令牌流上,您可以从中轻松构建AST。但是在这个级别上,名称尚未解析(这是有道理的,宏和自定义派生可能会影响名称的解析方式,因此需要先完全消耗它们。)