实际上proc-macro2是基于proc_macro封装的一层,用于服务两方面: 把类似过程宏(proc-macro-like)的功能带入其它上下文,比如build.rs或者main.rs。 使过程宏支持单元测试 由于proc_macro只能在proc_macro类型的crate中使用,所以想在非过程宏的代码中单元测试它们或者使用它们是不可能的。 而proc-macro2可以让我们在非...
在Rust中,编写过程宏,必须在Cargo.toml中设置[lib]proc-macro = true,这样就导致该库只能用于编写过程宏代码,无法在其他库中编写proc-macro代码,比如在其他包中无法使用use proc_macro::TokenStream;,这样就很难对宏代码进行单元测试。 所以第三方提供了proc-macro2这样的包,可以在任何库类型中编写过程宏代码逻辑,...
在Rust源代码中,rust/library/proc_macro/src/bridge/fxhash.rs文件是proc_macro库中的一个模块,主要提供了与哈希相关的功能。 该文件中定义了一个名为FxHasher的结构体实现。FxHasher是一个自定义的哈希器,它采用了一种叫做"Fowler-Noll-Vo" (FNV) 的哈希算法,该算法简单高效且拥有较低的冲突率。FxHasher结构...
[dependencies]produceral_macro={path="../procedural_macro_demos/procedural_macro"}# 本地路径引用 2、使用过程宏 通过#[crate_name::proc_macro_func("过程宏名字-任意")] 类似#[produceral_macro::my_first_attr_proc_macro("my_first_procedural_macro")] #[produceral_macro::my_first_attr_proc_ma...
cargo new hello-macro --lib procedural macros 只能在proc-macro类型的 crate 内定义,所以需要修改 Cargo.toml: [lib]proc-macro=true 删除src/lib.rs里的全部内容,然后定义第一个过程宏(procedural macro): useproc_macro::TokenStream;#[proc_macro]pubfnhello_proc(input: TokenStream)->TokenStream { ...
[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...
#[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. 属性宏 属性宏的定义方法如下: ...
然后我们可以看到我们此时依赖的crate之中甚至还有个proc-macro2(其实和proc-macro并非版本更新的关系) 那么从这个库的文档开始看起,首先该库是上述我们提到的两个库中syn的依赖项,该库在官方标准的proc-macro的上层,但支持从proc-macro的TokenStream到其自己的TokenStream之间相互转换,倒也不算麻烦,这里我们主要了解一...
[lib]proc-macro=truepath="src/lib.rs" 而编写过程宏,在stable版本里,我们需要借助三个crate: syn,这个是用来解析语法树(AST)的。各种语法构成 quote,解析语法树,生成rust代码,从而实现你想要的新功能。 proc_macro(std)和proc_macro2(3rd-party)
首先,过程宏库的Cargo.toml文件需要标明这是一个proc macro库,并且一般来说,会使用到如下三个库的依赖: [package]name="tool-derive"version="0.1.0"authors= ["piaoliu <441594700@qq.com>"][lib]name="tool_derive"proc-macro=true[dependencies]proc-macro2="^0.4.6"quote="^0.6.3"syn="^0.14.2" ...