ItemFn};#[proc_macro_derive(MyDebug)]pubfnmy_debug_derive(input:TokenStream)->TokenStream{letast=parse_macro_input!(inputasDeriveInput);letname=&ast.ident;letgen=quote!{implstd::fmt::Debugfor#name{fnfmt(&self,f:&mutstd::fmt::Formatter<'_>)->std::fmt::Result{write!(f,"你好,我是结...
pub fn my_attribute(_attr: TokenStream, item: TokenStream) -> TokenStream { let input = parse_macro_input!(item as ItemFn); let name = &input.sig.ident; let block = &input.block; let expanded = quote! { fn #name() { println!("Function {} is called", stringify!(#name)); #blo...
四、Debug部分实践 在本系列教程的后续篇章中,我们将通过实践来深入了解Debug部分的解决方案。我们将使用具体的例子来演示如何调试属性式过程宏,并分享一些实用的调试技巧和建议。 首先,你需要从GitHub上下载Proc Macro Workshop项目,并切换到Debug部分的目录。然后,你可以开始逐步解决Debug部分的挑战,通过调试和修改代码...
函数宏(function-like macro):看起来像函数的宏,但在编译期进行处理。 属性宏(attribute macro):可以在其他代码块上添加属性,为代码块提供更多功能。 派生宏(derive macro):为 derive 属性添加新的功能,这是我们平时使用最多的宏,比如 #[derive(Debug)] 为数据结构提供 Debug trait 的实现、#[derive(Serialize,...
4. 类函数宏(Function-Like Macros) 类函数宏是另一种常见的函数宏类型,它与声明宏不同,可以像函数一样接受参数并返回代码片段。函数宏是通过编写Rust代码来处理输入的代码,并在编译期间生成新的代码。 4.1 类函数宏的定义 函数宏的定义类似于声明宏,但需要使用proc_macro模块来导入宏的功能。
派生宏(Derive macro):用于结构体(struct)、枚举(enum)、联合(union)类型,可为其实现函数或特征(Trait)。 属性宏(Attribute macro):用在结构体、字段、函数等地方,为其指定属性等功能。如标准库中的#[inline]、#[derive(...)]等都是属性宏。 函数式宏(Function-like macro):用法与普通的规则宏类似,但功能...
显式调用panic!()宏(macro) 程序出现错误,例如:数组访问越界 默认情况下,Rust 会打印错误信息、解开(unwind)、清理栈内存、退出程序。通过环境变量,可以打印调用栈(calling stack),有助于更好 debug。 解开(unwind)栈内存 VS 立即终止 默认情况下,当 panic 发生时,程序会开始解开(unwinding),Rust 会回到栈内存中...
过程宏:是一种更为高级的宏,它通过编写Rust代码来处理输入的代码,并在编译期间生成新的代码。过程宏主要用于属性宏(Attribute Macros)、类函数宏(Function-Like Macros)和派生宏(Derive Macros)等场景。 本篇博客将主要介绍声明宏和过程宏。 2. 声明宏(macro_rules!宏) ...
过程宏:是一种更为高级的宏,它通过编写Rust代码来处理输入的代码,并在编译期间生成新的代码。过程宏主要用于属性宏(Attribute Macros)、类函数宏(Function-Like Macros)和派生宏(Derive Macros)等场景。 本篇博客将主要介绍声明宏和过程宏。 2. 声明宏(macro_rules!宏) ...
4. 类函数宏(Function-Like Macros) 类函数宏是另一种常见的函数宏类型,它与声明宏不同,可以像函数一样接受参数并返回代码片段。函数宏是通过编写Rust代码来处理输入的代码,并在编译期间生成新的代码。 4.1 类函数宏的定义 函数宏的定义类似于声明宏,但需要使用proc_macro模块来导入宏的功能。