这就不得不引申出今天的主题,过程宏 (proc-macro) 了。 什么是过程宏 proc-macro 在C语言中,我们都学习过编译的过程,也就是从源代码,通过预编译把用户的宏翻译成真实代码,然后再进行后续的编译,链接 balabala。 graph LR source(main.v) precomple_source(main.v) source -->|预编译| precomple_source ...
在Rust中,编写过程宏,必须在Cargo.toml中设置[lib]proc-macro = true,这样就导致该库只能用于编写过程宏代码,无法在其他库中编写proc-macro代码,比如在其他包中无法使用use proc_macro::TokenStream;,这样就很难对宏代码进行单元测试。 所以第三方提供了proc-macro2这样的包,可以在任何库类型中编写过程宏代码逻辑,...
在Rust中,编写过程宏,必须在Cargo.toml中设置[lib]proc-macro = true,这样就导致该库只能用于编写过程宏代码,无法在其他库中编写proc-macro代码,比如在其他包中无法使用use proc_macro::TokenStream;,这样就很难对宏代码进行单元测试。 所以第三方提供了proc-macro2这样的包,可以在任何库类型中编写过程宏代码逻辑,...
proc_macro2:: Span::call_site() 真香 完整 #[proc_macro_attribute] pub fn sorted( _args: proc_macro::TokenStream, input: proc_macro::TokenStream, ) -> proc_macro::TokenStream { let item = syn::parse_macro_input!(input as syn::Item); match solution1::solution(&item) { syn::Resu...
首先,过程宏库的Cargo.toml文件需要标明这是一个proc macro库,并且一般来说,会使用到如下三个库的依赖: [package]name="tool-derive"version="0.1.0"authors= ["piaoliu <[email protected]>"][lib]name="tool_derive"proc-macro=true[dependencies]proc-macro2="^0.4.6"quote="^0.6.3"syn="^0.14.2" ...
在Rust源代码中,rust/library/proc_macro/src/bridge/selfless_reify.rs文件的作用是实现了与proc_macro自定义属性之间的通信桥梁。 Rust是一种静态强类型系统的编程语言,它提供了一种叫做"过程宏"(proc_macro)的功能,使开发者能够在编译时处理Rust代码的语法结构。proc_macro可以用于编写自定义属性、函数和类型,从...
proc-macro2库:提供了编译器插件所需的TokenStream类型和相关工具。 通过学习和使用这些库,开发者可以更深入地了解如何编写Rust的编译器插件,并在实际项目中应用它们来扩展编译时的能力。 结尾 Rust的编译器插件是语言生态系统中的一个强大工具,它允许开发者以编程方式扩展编译器的功能。随着Rust在系统编程和高性能应用...
过程宏的整个过程,就像是水的生态循环。蒸汽从大海(TokenSteam)中来,然后通过大雨(Syn),降到地上(Quote),形成涓涓细流(proc_macro2::TokenStream)最终汇入大海(TokenSteam)。 理解过程宏的展开原理,将有助于你学习过程宏。 小结 本篇文章主要介绍了 Rust 代码的编译过程,以及 Rust 宏代码的展开机制,学习这些内容...
首先,#[proc_macro_derive(Builder)]表明derive_builder是一个派生宏,Builder表示它将作用的地方。比如定义如下结构体 代码语言:javascript 代码运行次数:0 运行 AI代码解释 #[derive(Builder)]struct Command{// ...} 就会触发以上派生宏执行。至于其中的Builder具体代表什么含义,本期暂不展开,后面再详细介绍。
3、proc_macro2 更好的proc_macro更方便的接口,能和syn、quote一起更好的配合应用。 什么是过程宏? 过程宏(Procedure Macro)是Rust中的一种特殊形式的宏,它将提供比普通宏更强大的功能。方便起见,本文将Rust中由macro_rules!定义的宏称为规则宏以示区分。