#[proc_macro_derive(Builder)]fnderive_builder(input:TokenStream)->TokenStream{let_=input;unimplemented!()} 首先,#[proc_macro_derive(Builder)]表明derive_builder是一个派生宏,Builder表示它将作用的地方。比如定义如下结构体 代码语言:javascript 代码运行次数:0 运行 AI代码解释 #[derive(Builder)]struct Com...
在Rust中,编写过程宏,必须在Cargo.toml中设置[lib]proc-macro = true,这样就导致该库只能用于编写过程宏代码,无法在其他库中编写proc-macro代码,比如在其他包中无法使用use proc_macro::TokenStream;,这样就很难对宏代码进行单元测试。 所以第三方提供了proc-macro2这样的包,可以在任何库类型中编写过程宏代码逻辑,...
使用这quote,syn,proc_macro2三个库来编写过程宏后,框架代码基本一致,一般有如下三个步骤,如下方式: useproc_macro::TokenStream;usequote::quote;usesyn::{parse_macro_input, DeriveInput};#[proc_macro_derive(MyMacro)]pubfnmy_macro(input: TokenStream)->TokenStream {// 将输入的标记解析成语法树letinput...
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,"你好,我是结...
然后我们可以看到我们此时依赖的crate之中甚至还有个proc-macro2(其实和proc-macro并非版本更新的关系) 那么从这个库的文档开始看起,首先该库是上述我们提到的两个库中syn的依赖项,该库在官方标准的proc-macro的上层,但支持从proc-macro的TokenStream到其自己的TokenStream之间相互转换,倒也不算麻烦,这里我们主要了解一...
proc-macro = true [dependencies] proc-macro2 = "^0.4.6" quote = "^0.6.3" syn = "^0.14.2" syn:用来解析tokenstream,并且提供各种字符串转成token的方法类型 quote: 主要用到一个宏quote!,用来将字符串和token类型拼接的大字符串转换成tokenstream交还给编译器 ...
实际上proc-macro2是基于proc_macro封装的一层,用于服务两方面: 把类似过程宏(proc-macro-like)的功能带入其它上下文,比如build.rs或者main.rs。 使过程宏支持单元测试 由于proc_macro只能在proc_macro类型的crate中使用,所以想在非过程宏的代码中单元测试它们或者使用它们是不可能的。
过程宏的整个过程,就像是水的生态循环。蒸汽从大海(TokenSteam)中来,然后通过大雨(Syn),降到地上(Quote),形成涓涓细流(proc_macro2::TokenStream)最终汇入大海(TokenSteam)。 理解过程宏的展开原理,将有助于你学习过程宏。 小结 本篇文章主要介绍了 Rust 代码的编译过程,以及 Rust 宏代码的展开机制,学习这些内容...
Code cargo install dufs Meta rustc --version --verbose: rustc -V rustc 1.71.1 Error output cargo install dufs Updating crates.io index Installing dufs v0.43.0 Updating crates.io index Compiling proc-macro2 v1.0.89 thread 'rustc' panicked...
2 (*)└── tracing-attributes v0.1.24 (proc-macro) └── tracing v0.1.38 ├── druid v0.8.3 (*) └── druid-shell v0.8.3 └── druid v0.8.3 (*)通过 cargo tree -d 发现 syn 有依赖两个版本,syn v1.0.109 和 syn v2.0.15。发现冲突原因 查找依赖 syn...