在Rust源代码中,rust/library/proc_macro/src/bridge/fxhash.rs文件是proc_macro库中的一个模块,主要提供了与哈希相关的功能。 该文件中定义了一个名为FxHasher的结构体实现。FxHasher是一个自定义的哈希器,它采用了一种叫做"Fowler-Noll-Vo" (FNV) 的哈希算法,该算法简单高效且拥有较低的冲突率。FxHasher结构...
由于proc_macro crate 是专门为 proc_macro 类型 crate 设计的,因此使它们可进行单元测试或从非 proc_macro 代码中访问它们几乎是不可能的。鉴于此,proc-macro2 crate 模仿了原始 proc_macro crate 的 API,在 proc_macro crates 中充当包装器,在非 proc_macro crates 中则可独立使用。因此,建议针对 proc_macro...
#[proc_macro]pubfnmy_proc_macro(input:TokenStream)->TokenStream{TokenStream::new()} 使用#[proc_macro]属性定义 属性宏 #[proc_macro_attribute]pubfnmy_attribute(input:TokenStream,annotated_item:TokenStream)->TokenStream{TokenStream::new()} 使用#[proc_macro_attribute]属性定义 派生宏 #[proc_macro_de...
然后我们可以看到我们此时依赖的crate之中甚至还有个proc-macro2(其实和proc-macro并非版本更新的关系) 那么从这个库的文档开始看起,首先该库是上述我们提到的两个库中syn的依赖项,该库在官方标准的proc-macro的上层,但支持从proc-macro的TokenStream到其自己的TokenStream之间相互转换,倒也不算麻烦,这里我们主要了解一...
在Rust编程语言中,过程宏(proc-macro)是一种强大的元编程工具,允许开发者在编译时执行自定义的代码生成任务。这些宏可以扩展Rust的语法,使得开发者能够以更简洁、更直观的方式编写代码。然而,由于过程宏的复杂性,它们的使用和学习曲线都相对陡峭。为了解决这个问题,Proc Macro Workshop项目应运而生,它提供了一系列精...
在Rust中,派生宏是一种特殊的宏,它允许开发者为自定义的数据类型自动实现trait。派生宏使用proc_macro_derive属性来定义,其基本形式如下: 代码语言:javascript 复制 use proc_macro;#[proc_macro_derive(YourTrait)]pub fnyour_derive_macro(input:proc_macro::TokenStream)->proc_macro::TokenStream{// 派生宏的...
proc_macro是Rust编译器提供的编写过程宏所需的类型和工具,过程宏有以下三种表示形式: derive式 函数带有#[proc_macro_derive(Name)]属性或者#[proc_macro_derive(Name, attributes(attr))]属性 函数签名为pub fn xxxx (proc_macro::TokenStream) -> proc_macro::TokenStream ...
在上述例子中,我们使用proc_macro模块导入了TokenStream和proc_macro_attribute宏,然后定义了一个名为check_arg的自定义属性宏。自定义属性宏接受两个参数:input表示被宏标记的代码片段,attr表示宏的属性参数。在宏展开中,我们可以对输入的代码进行处理,并根据需要生成新的代码片段。
派生宏(Derive Macros):用于自动实现trait(比如Copy、Debug)的宏。 属性宏(Attribute Macros):用于在声明上附加额外的元数据,如#[derive(Debug)]。 过程宏的实现通常需要使用 proc_macro 库提供的功能,例如 TokenStream 和 TokenTree,以便更直接地操纵源代码。
在Rust中,类函数宏是一种特殊的宏,它允许开发者创建类似函数调用的宏,并在编译期间对代码进行生成和转换。类函数宏使用proc_macro模块中的TokenStream类型来处理输入和输出。类函数宏的定义基本形式如下: externcrateproc_macro;useproc_macro::TokenStream;#[proc_macro]pubfnfunction_macro(input: TokenStream)->Token...