} = parse_macro_input!(input); let name = ident.to_string(); quote! { fn this_is_macro_auto() { println!("struct name {}", #name); } }.into() } 在quote中可以用#来序列化局数的变量数据。那么此时我们运行程序,将会输出: struct name HcluaMacro 类名正确的被打印出来。 字段处理 定...
函数宏的定义类似于声明宏,但需要使用proc_macro模块来导入宏的功能。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 use proc_macro::TokenStream;#[proc_macro]pub fnexample_macro(input:TokenStream)->TokenStream{// 处理输入的代码,并生成新的代码// ...} 在上述例子中,我们使用proc_macro模块导入了...
macro_rules! generate_getter{ ($field:ident) => { fn get_ $field(&self) -> &Self::$field { &self.$field } };} struct Person{ name: String,age: u32,} impl Person{ generate_getter!(name);generaate_getter!(age);} fn main(){ let person = Person{name: String::from("jiawy"...
pubfnmy_proc_macro(ident:TokenStream)->TokenStream{ letnew_func_name=format!("test_{}",ident.to_string()); letconcated_ident=Ident::new(&new_func_name,Span::call_site());// 创建新的ident,函数名 letexpanded=quote!{ // 不能直接这样写trait bound,T: Debug // 会报错,找不到Debug tra...
#[proc_macro_derive(Printable)] pub fn print_info_derive(input: TokenStream) -> TokenStream { let struct_name = to_snake_case(input.ident.to_string().as_str()); let fields = match input.data.clone() { syn::Data::Struct(data) => data.fields, _ => panic!("Only structs are suppo...
声明式宏(Declarative Macros)允许开发者使用宏规则(macro_rules!)创建模式匹配和替换规则,根据匹配到的模式进行代码替换。 声明式宏是一种基于文本的宏,它仅仅是简单的文本替换,并没有对语法树进行操作。 过程宏(Procedural Macros)允许开发者在代码生成阶段使用 Rust 代码来处理输入并生成输出。
macro_rules!macro_name {// 宏规则// ...} 其中,macro_name是宏的名称,宏规则是一系列模式匹配和替换的规则,用于匹配输入的代码片段并生成相应的代码片段。 1.2 宏的分类 Rust中的宏分为两类:声明宏(Declarative Macros)和过程宏(Procedural Macros)。
#[derive(Getters)]structTest{#[getter(name=get_name)]name:String} 函数式 函数带有#[proc_macro]属性 函数签名为pub fn xxx (proc_macro::TokenStream) -> proc_macro::TokenStream 函数的名称就是使用时名称,如下例子: #[proc_macro]pubfnlazy_static(input: TokenStream)->TokenStream {//...} ...
macro_rules!macro_name {// 宏规则// ...} 其中,macro_name是宏的名称,宏规则是一系列模式匹配和替换的规则,用于匹配输入的代码片段并生成相应的代码片段。 1.2 宏的分类 Rust中的宏分为两类:声明宏(Declarative Macros)和过程宏(Procedural Macros)。
macro_rules! point { ($name:ident, $x:expr, $y:expr, $color:expr) => { struct $name { x: i32, y: i32, color: String, } impl $name { fn new(x: i32, y: i32, color: &str) -> Self { $name { x, y, color: color.to_string() } ...