在 Rust属性宏 的世界里,你可以通过编写代码来生成代码,从而极大地提升开发效率和代码可读性。本教程将手把手带你从零开始,理解并实现一个简单的自定义属性宏。无论你是刚接触 Rust 的新手,还是已有一定经验但尚未尝试过宏的开发者,都能轻松跟上。
在 Rust 中,宏分为两类:声明宏(macro_rules!)和过程宏(Procedural Macros)。而属性宏是过程宏的一种,它允许你定义新的属性(以 # 开头),作用于函数、结构体、模块等项上,并在编译时对其进行转换或生成额外代码。
属性宏可以让你:
例如,#[derive(Debug)] 就是一个内置的派生宏(也属于过程宏),而像 #[tokio::main] 则是一个典型的属性宏,它把普通函数包装成异步运行时入口。
我们将创建一个名为 my_macro 的属性宏,它会在函数执行前后打印日志。这是学习 Rust宏教程 的经典入门案例。
Rust 的过程宏必须放在独立的 crate 中,且该 crate 类型为 proc-macro。执行以下命令:
cargo new --lib my_macro 编辑 my_macro/Cargo.toml,添加以下内容:
[package]name = "my_macro"version = "0.1.0"edition = "2021"[lib]proc-macro = true[dependencies]proc-macro2 = "1.0"quote = "1.0"syn = { version = "2.0", features = ["full"] } 这里我们引入了三个关键依赖:
syn:用于解析 Rust 代码为语法树(AST)quote:用于将语法树重新组合成 Rust 代码proc-macro2:提供更友好的过程宏 API打开 src/lib.rs,写入以下代码:
use proc_macro::TokenStream;use quote::quote;use syn::{parse_macro_input, ItemFn};#[proc_macro_attribute]pub fn my_log(_args: TokenStream, input: TokenStream) -> TokenStream { // 将输入的函数解析为 AST let input_fn = parse_macro_input!(input as ItemFn); let fn_name = &input_fn.sig.ident; // 构造新函数:在原函数前后加日志 let expanded = quote! { pub fn #fn_name() { println!("[LOG] Entering function: {}", stringify!(#fn_name)); { #input_fn } println!("[LOG] Exiting function: {}", stringify!(#fn_name)); } }; TokenStream::from(expanded)} 注意:#[proc_macro_attribute] 告诉编译器这是一个属性宏。它接收两个参数:_args(属性后的括号内容,本例未使用)和 input(被修饰的函数)。
回到项目根目录,创建一个二进制 crate 来测试:
cargo new --bin appcd app 修改 app/Cargo.toml,添加对宏 crate 的依赖:
[dependencies]my_macro = { path = "../my_macro" } 然后在 app/src/main.rs 中使用:
use my_macro::my_log;#[my_log]fn greet() { println!("Hello from greet!");}fn main() { greet();} 在 app 目录下运行:
cargo run 输出应为:
[LOG] Entering function: greetHello from greet![LOG] Exiting function: greet 初学者在学习 自定义属性宏 时,常遇到以下问题:
syn 的 parse 方法时,应妥善处理解析失败的情况pub)建议后续学习:
syn 和 quote 的官方文档serde、tokio 中的宏实现#[my_log(level = "debug")])通过本篇 Rust编程入门 教程,你应该已经掌握了如何创建和使用一个基本的属性宏。虽然过程宏看起来有些复杂,但一旦理解其原理,你就能用它写出极其强大和简洁的代码。继续练习,你很快就能在自己的项目中灵活运用 Rust属性宏 了!
本文由主机测评网于2025-12-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129292.html