这就不得不引申出今天的主题,过程宏 (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...
proc-macro-error:提供过程宏中错误报告的辅助工具,使错误处理更加友好和易于定位问题。 strum:提供一系列宏,用于枚举类型与字符串之间的转换以及其他枚举相关的工具。 proc-macro-crate:帮助过程宏定位本身所在的crate,解决宏内部引用宏定义所在的crate时的路径问题。 proc-macro2:代替编译器内建的proc_macro库,提供更...
首先,过程宏库的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可以用于编写自定义属性、函数和类型,从...
过程宏的整个过程,就像是水的生态循环。蒸汽从大海(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...
#![feature(proc_macro_hygiene, decl_macro)]属性为Rocket框架启用了Rust实验特性。#[macro_use]属性从Rocket模块导入宏。下面是一个处理程序函数,接到请求时提供HTML:复制 #[get("/")]fn hello_world() -> content::Html<&'static str> { content::Html("Hello, world!")}1.2.3.4.5.6.7.he...