在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 的TokenStream 需要调用一下 into方法 转为proc_macro 的TokenStream 。对于新手这里可能会有疑惑,其实 proc_macro2 并不是 proc_macro 的升级版本,proc_macro2 是对 proc_macro 的封装,实现了可以在任意上下文环境调用过程宏的api, 以及可以使过程宏支持单元测试。 代码地址 github.com/...
对于宏编程,Rust中提供了几种过程宏的库操作支持,即: 1、Syn 它是基于TokenStream的一种语法分析过程,它并不很强大,需要自定义扩展一些宏,比如Rust中的函数和闭包等。 2、Quote 应用比较简单,适合使用。 3、proc_macro2 更好的proc_macro更方便的接口,能和syn、quote一起更好的配合应用。
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...
过程宏的整个过程,就像是水的生态循环。蒸汽从大海(TokenSteam)中来,然后通过大雨(Syn),降到地上(Quote),形成涓涓细流(proc_macro2::TokenStream)最终汇入大海(TokenSteam)。 理解过程宏的展开原理,将有助于你学习过程宏。 小结 本篇文章主要介绍了 Rust 代码的编译过程,以及 Rust 宏代码的展开机制,学习这些内容...
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...