属性宏(Attribute Macros) 属性宏用于为结构体、枚举、函数等添加元数据。属性宏是通过在目标代码上添加自定义属性实现的。下面是一个简单的示例,使用derive属性宏来自动生成结构体的Debug实现: #[derive(Debug)] struct Person { name: String, age: u32, } fn main() { let person = Person { name: Strin...
实现一个属性宏(Attribute macro)保证 Enum 里的属性是按照字母顺序排序的,如果发现不是这样的,在编译阶段抛出错误,并且提示具体触发错误的属性位置 效果如下: #[sorted] #[derive(Debug)] pub enum Error { BlockSignal(signal::Error), CreateCrasClient(libcras::Error), CreateEventFd(sys_util::Error), Cre...
在Rust中,属性宏是一种特殊的宏,它允许开发者在代码上方添加自定义的属性,并在编译期间对代码进行处理。属性宏使用proc_macro_attribute属性来定义,其基本形式如下: extern crate proc_macro; use proc_macro::TokenStream; #[proc_macro_attribute] pub fn attribute_macro(attr: TokenStream, item: TokenStream) -...
在Rust中,派生宏是一种特殊的宏,它允许开发者为自定义的数据类型自动实现trait。派生宏使用proc_macro_derive属性来定义,其基本形式如下: use proc_macro; #[proc_macro_derive(YourTrait)] pub fn your_derive_macro(input: proc_macro::TokenStream) -> proc_macro::TokenStream { // 派生宏的处理逻辑 // ...
属性宏(attribute macro):可以在其他代码块上添加属性,为代码块提供更多功能。 派生宏(derive macro):为 derive 属性添加新的功能,这是我们平时使用最多的宏,比如 #[derive(Debug)] 为数据结构提供 Debug trait 的实现、#[derive(Serialize, Deserialize)]为数据结构提供 serde 相关 trait 的实现。
派生宏(Derive Macros):用于自动实现trait(比如Copy、Debug)的宏。 属性宏(Attribute Macros):用于在声明上附加额外的元数据,如#[derive(Debug)]。 过程宏的实现通常需要使用 proc_macro 库提供的功能,例如 TokenStream 和 TokenTree,以便更直接地操纵源代码。
为了编写一个属性式宏,我们先用cargo new macro-demo --lib来创建一个项目。创建完成后,修改Cargo.toml来通知 cargo,该项目将会创建过程宏。 # Cargo.toml[lib]proc-macro=true 现在,我们可以开始过程宏学习之旅了。 过程宏是公开的函数,接收TokenStream作为参数并返回另一个TokenStream。要想写一个过程宏,我们需...
派生宏和属性宏是Rust中两种强大的进阶宏。派生宏可以自动生成实现特定trait的代码,减少手动实现的繁琐性。而属性宏则允许我们为代码添加自定义属性,并在编译时进行处理。通过合理使用这些进阶宏,我们可以提高Rust代码的可读性和可维护性,使项目更加健壮和高效。
派生宏(Derive macro):用于结构体(struct)、枚举(enum)、联合(union)类型,可为其实现函数或特征(Trait)。 属性宏(Attribute macro):用在结构体、字段、函数等地方,为其指定属性等功能。如标准库中的#[inline]、#[derive(...)]等都是属性宏。 函数式宏(Function-like macro):用法与普通的规则宏类似,但功能...
开发过程宏时经常需要处理结构体或枚举体上的属性参数,如下 Command 结构体的args字段有属性each = "arg", 代码语言:rust 复制 #[derive(Builder)]pubstructCommand{executable:String,#[builder(each ="arg")]args:Vec<String>,#[builder(each ="env")]env:Vec<String>,current_dir:Option<String>,} ...