实际上proc-macro2是基于proc_macro封装的一层,用于服务两方面: 把类似过程宏(proc-macro-like)的功能带入其它上下文,比如build.rs或者main.rs。 使过程宏支持单元测试 由于proc_macro只能在proc_macro类型的crate中使用,所以想在非过程宏的代码中单元测试它们或者使用它们是不可能的。 而proc-macro2可以让我们在非...
在Rust源代码中,rust/library/proc_macro/src/bridge/fxhash.rs文件是proc_macro库中的一个模块,主要提供了与哈希相关的功能。 该文件中定义了一个名为FxHasher的结构体实现。FxHasher是一个自定义的哈希器,它采用了一种叫做"Fowler-Noll-Vo" (FNV) 的哈希算法,该算法简单高效且拥有较低的冲突率。FxHasher结构...
在Rust中,编写过程宏,必须在Cargo.toml中设置[lib]proc-macro = true,这样就导致该库只能用于编写过程宏代码,无法在其他库中编写proc-macro代码,比如在其他包中无法使用use proc_macro::TokenStream;,这样就很难对宏代码进行单元测试。 所以第三方提供了proc-macro2这样的包,可以在任何库类型中编写过程宏代码逻辑,...
由于proc_macro crate 是专门为 proc_macro 类型 crate 设计的,因此使它们可进行单元测试或从非 proc_macro 代码中访问它们几乎是不可能的。鉴于此,proc-macro2 crate 模仿了原始 proc_macro crate 的 API,在 proc_macro crates 中充当包装器,在非 proc_macro crates 中则可独立使用。因此,建议针对 proc_macro...
[lib]proc-macro=true# 开启过程宏 # 引入如下三个crate的原因 参考上面编译过程图:在生成最终的TokenStream前,需要依赖这三个crate[dependencies]proc-macro2="1.0.34"syn={version="1.0.82",feature="full"}quote="1.0.10" 项目结构 过程宏需要定义在一个单独的crate中,主要是因为过程宏是一段在编译crate前...
[lib] proc-macro = true [dependencies] syn = { version = "1.0", features = ["full"] } quote = "1.0" proc-macro2 = "1.0" 定义一个过程宏: proc_macro_derive externcrateproc_macro;useproc_macro::TokenStream;usequote::{format_ident,quote};usesyn::{self,parse_macro_input,Data,DataStr...
比如说,我的过程宏要展开成一大坨代码,也就是构造一个TokenStream,用proc_macro2要么得拼接大量接字符...
#[proc_macro_derive(Builder)] fnderive_builder(input:TokenStream)->TokenStream{ let_=input; unimplemented!() } 1. 2. 3. 4. 5. 6. 其使用方法如下: #[derive(Builder)] structCommand{ // ... } 1. 2. 3. 4. 属性宏 属性宏的定义方法如下: ...
# cargo.toml[lib]proc-macro=true// lib.rsextern crate proc_macro; 然后,最基本的proc macro可以是一个简单的编译期函数(注意,此场景下不如直接编写另一种宏来的方便快捷) useproc_macro::TokenStream;#[proc_macro]pubfnhello_proc_macro(_:TokenStream)->TokenStream{"\"HelloWorld\"...
The skeleton of a typical procedural macro typically looks like this: extern crate proc_macro; #[proc_macro_derive(MyDerive)] pub fn my_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let input = proc_macro2::TokenStream::from(input); let output: proc_macro2::TokenSt...