四、Debug部分实践 在本系列教程的后续篇章中,我们将通过实践来深入了解Debug部分的解决方案。我们将使用具体的例子来演示如何调试属性式过程宏,并分享一些实用的调试技巧和建议。 首先,你需要从GitHub上下载Proc Macro Workshop项目,并切换到Debug部分的目录。然后,你可以开始逐步解决Debug部分的挑战,通过调试和修改代码...
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,"你好,我是结...
由于proc_macro crate 是专门为 proc_macro 类型 crate 设计的,因此使它们可进行单元测试或从非 proc_macro 代码中访问它们几乎是不可能的。鉴于此,proc-macro2 crate 模仿了原始 proc_macro crate 的 API,在 proc_macro crates 中充当包装器,在非 proc_macro crates 中则可独立使用。因此,建议针对 proc_macro...
在Rust中,派生宏是一种特殊的宏,它允许开发者为自定义的数据类型自动实现trait。派生宏使用proc_macro_derive属性来定义,其基本形式如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 use proc_macro;#[proc_macro_derive(YourTrait)]pub fnyour_derive_macro(input:proc_macro::TokenStream)->proc_macro...
让我们从一个简单的例子开始,创建一个派生宏用于为自定义的数据类型自动实现Debugtrait。 useproc_macro;#[proc_macro_derive(Debug)]pubfndebug_derive_macro(input: proc_macro::TokenStream)->proc_macro::TokenStream {letoutput= input.to_string();letresult=format!("#[derive(Debug)]\n{}\nimpl Debug...
在上述例子中,我们使用proc_macro模块导入了TokenStream和proc_macro宏,然后定义了一个名为example_macro的函数宏。函数宏接受一个TokenStream作为输入,并将其转换为代码片段进行处理,然后将生成的新代码再次包装在TokenStream中返回。 4.2 类函数宏的使用 要使用函数宏,我们需要将其导入到当前的作用域,并像普通的宏一样...
派生宏(Derive Macros):用于自动实现trait(比如Copy、Debug)的宏。 属性宏(Attribute Macros):用于在声明上附加额外的元数据,如#[derive(Debug)]。 过程宏的实现通常需要使用 proc_macro 库提供的功能,例如 TokenStream 和 TokenTree,以便更直接地操纵源代码。
派生宏一般是用来实现一个派生(derive,比如#[derive(Debug)]等) 它们基本上都是一样的,不过由于它们函数的定义,在输入和输出会有一些不同点。 简单地说,过程宏就是一个函数处理的token stream。我们来先简单的看下它们的定义和区别。 函数宏 #[proc_macro]pubfnmy_proc_macro(input:TokenStream)->TokenStream{...
#[macro_use(debug, trace)] extern crate log; 则可以只导入列表中指定的宏,若不指定则导入所有的宏。 proc_macro 定义类似函数的宏 proc_macro_derive 定义一个派生宏。 proc_macro_attribute 定义属性宏。 --- 5.诊断 allow, warn, deny, forbid - lint 相关标志开关 (目前的Rust编译器已自带的Linter,...
fluent-bundle v0.15.2 (*)│ └── intl_pluralrules v7.0.2│ └── fluent-bundle v0.15.2 (*)└── druid-derive v0.5.0 (proc-macro) └── druid v0.8.3 (*)syn v2.0.15├── thiserror-impl v1.0.40 (proc-macro)│ └── thiserror v1.0.40│ └...