// attributes 可以加到 fields 上, 如果不需要可以不要这个 attributes#[proc_macro_derive(Builder, attributes(attr1, attr2,))]pubfnmy_builder(input: TokenStream)->TokenStream {letinput: syn::DeriveInput = syn::parse(input).unwrap();letsyn::Data::Struct(data) = input.dataelse{panic!("Sorry...
使用#[proc_macro]属性定义 属性宏 #[proc_macro_attribute]pubfnmy_attribute(input:TokenStream,annotated_item:TokenStream)->TokenStream{TokenStream::new()} 使用#[proc_macro_attribute]属性定义 派生宏 #[proc_macro_derive(MyDerive)]pubfnmy_derive(annotated_item:TokenStream)->TokenStream{TokenStream::new(...
use proc_macro;#[proc_macro_derive(YourTrait)]pub fnyour_derive_macro(input:proc_macro::TokenStream)->proc_macro::TokenStream{// 派生宏的处理逻辑// ...} 在上述例子中,我们使用proc_macro_derive属性定义了一个名为YourTrait的派生宏。派生宏接受一个proc_macro::TokenStream参数input,表示派生宏调用的...
proc-macro = true 完整代码先贴在这里,稍后分析一下, useproc_macro::TokenStream;usequote::quote;usesyn::{parse_macro_input,DeriveInput,Data,Ident};usesyn::Fields::Named;#[proc_macro_derive(Printer)]pubfnderive(input:TokenStream)->TokenStream{// Parse the input tokens into a syntax treeletinpu...
类函数宏(Function-like macro),看上去就像是函数调用。Rust宏相比于C的宏,在类型安全性、模式匹配、...
首先一个常规的proc-macro也许长这样: #[proc_macro_derive(Hello)]pubfnderive_hello(input:TokenStream)->TokenStream{letinput=parse_macro_input!(inputasDeriveInput);letexpanded=quote!{};TokenStream::from(expanded)} 这里用到了DeriveInput类型,我们简单看一下这个类型定义: ...
在上面的示例中,我们定义了一个名为add的过程宏。该函数使用#[proc_macro]属性标记,并接受一个名为input的参数。该参数表示传递给该宏的TokenStream。在函数体内部,我们使用迭代器来访问TokenStream中的每个元素,并使用format!宏将其格式化为字符串。最后,我们将结果转换为TokenStream并返回。
定义一个过程宏: proc_macro_derive externcrateproc_macro;useproc_macro::TokenStream;usequote::{format_ident,quote};usesyn::{self,parse_macro_input,Data,DataStruct,DeriveInput,Fields,FieldsNamed,Type};#[proc_macro_derive(Builder, attributes(builder))]pubfnderive(input:TokenStream)->TokenStream{epri...
在上述例子中,我们使用proc_macro模块中的TokenStream类型定义了一个名为function_macro的类函数宏。宏接受一个TokenStream参数input,表示宏调用的输入。在宏的处理逻辑中,我们可以根据input对代码进行生成和转换,并返回一个TokenStream作为输出。 1.2 类函数宏的特点 ...
#[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. 属性宏 属性宏的定义方法如下: ...