4. 类函数宏(Function-Like Macros) 类函数宏是另一种常见的函数宏类型,它与声明宏不同,可以像函数一样接受参数并返回代码片段。函数宏是通过编写Rust代码来处理输入的代码,并在编译期间生成新的代码。 4.1 类函数宏的定义 函数宏的定义类似于声明宏,但需要使用proc_macro模块来导入宏的功能。 代码语言:javascript...
函数宏的定义类似于声明宏,但需要使用proc_macro模块来导入宏的功能。 useproc_macro::TokenStream;#[proc_macro]pubfnexample_macro(input: TokenStream)->TokenStream {// 处理输入的代码,并生成新的代码// ...} 在上述例子中,我们使用proc_macro模块导入了TokenStream和proc_macro宏,然后定义了一个名为example_...
函数宏的定义类似于声明宏,但需要使用proc_macro模块来导入宏的功能。 useproc_macro::TokenStream;#[proc_macro]pubfnexample_macro(input: TokenStream)->TokenStream {// 处理输入的代码,并生成新的代码// ...} 在上述例子中,我们使用proc_macro模块导入了TokenStream和proc_macro宏,然后定义了一个名为example_...
这个foo函数由关键字fn开头,后面跟一个函数名($function_name: ident), 然后是一对(), 再跟一个函数体block macro_rules!function_item_matcher { (fn$name:ident() $block: block) => {fn$name() $block }; } function_item_matcher! {fnhello(){println!("hello"); } } 再复杂一点,给我们的foo...
类函数宏(Function-like macro),看上去就像是函数调用。 Rust宏相比于C的宏,在类型安全性、模式匹配、卫生性(见下面注释)、定义与使用上都有大幅提升;自然其复杂程度也相比C提升不少。但也不必担心,接下来我们将逐个看看它们的庐山真面目。 注:宏的卫生性(Hygiene)是指在宏展开过程中,确保宏生成的代码与宏调用...
let input = parse_macro_input!(item as ItemFn); let name = &input.sig.ident; let block = &input.block; let expanded = quote! { fn #name() { println!("Function {} is called", stringify!(#name)); #block } }; TokenStream::from(expanded) ...
在Rust中,宏是一种特殊的函数,可以使用macro_rules!关键字来定义。宏定义的基本语法如下: macro_rules! macro_name { // 宏规则 // ... } 1. 2. 3. 4. 其中,macro_name是宏的名称,宏规则是一系列模式匹配和替换的规则,用于匹配输入的代码片段并生成相应的代码片段。
在上述例子中,我们使用proc_macro模块中的TokenStream类型定义了一个名为function_macro的类函数宏。宏接受一个TokenStream参数input,表示宏调用的输入。在宏的处理逻辑中,我们可以根据input对代码进行生成和转换,并返回一个TokenStream作为输出。 1.2 类函数宏的特点 ...
属性宏(Attribute macro):用在结构体、字段、函数等地方,为其指定属性等功能。如标准库中的#[inline]、#[derive(...)]等都是属性宏。 函数式宏(Function-like macro):用法与普通的规则宏类似,但功能更加强大,可实现任意语法树层面的转换功能。 过程宏的定义与使用方法 ...
derive, attribute-like macros和function-like macros都是procedural macros。derive可以定义一个derive_a_macro库。例如hello_macro。1. 为自定义派生宏crate: hello_macro_derive的Cargo.toml添加必要依赖库’1 2 3 4 5 6 [lib] proc-macro = true#编译器用来读取和操作Rust代码 [dependencies] syn = "0.14....