面试题答案
一键面试- 实现步骤:
- 首先,需要解析输入的结构体定义,提取出结构体的名称和字段信息。
- 然后,为每个字段生成对应的访问器(getter)和修改器(setter)方法。
- 使用
proc_macro
crate 来创建过程宏。
- 完整代码:
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
#[proc_macro_derive(Accessor)]
pub fn accessor_derive(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
let struct_name = &ast.ident;
let fields = match &ast.data {
syn::Data::Struct(syn::DataStruct { fields, .. }) => fields,
_ => panic!("Only structs are supported"),
};
let getters_and_setters = fields.iter().map(|field| {
let field_name = &field.ident.expect("Field should have a name");
let field_type = &field.ty;
let getter_name = format!("get_{}", field_name);
let setter_name = format!("set_{}", field_name);
quote! {
pub fn #getter_name(&self) -> &#field_type {
&self.#field_name
}
pub fn #setter_name(&mut self, value: #field_type) {
self.#field_name = value;
}
}
});
let expanded = quote! {
impl #struct_name {
#(#getters_and_setters)*
}
};
expanded.into()
}
使用这个宏时,你可以这样定义结构体:
#[derive(Accessor)]
struct MyStruct {
field1: i32,
field2: String,
}
这样MyStruct
就会自动拥有get_field1
、set_field1
、get_field2
和set_field2
方法。