类函数宏(Function-like macro),看上去就像是函数调用。 Rust宏相比于C的宏,在类型安全性、模式匹配、卫生性(见下面注释)、定义与使用上都有大幅提升;自然其复杂程度也相比C提升不少。但也不必担心,接下来我们将逐个看看它们的庐山真面目。 注:宏的卫生性(Hygiene)是指在宏展开过程中,确保宏生成的代码与宏调用所在的上下文
类函数宏使用proc_macro模块中的TokenStream类型来处理输入和输出。类函数宏的定义基本形式如下: 代码语言:javascript 代码运行次数:0 extern crate proc_macro;use proc_macro::TokenStream;#[proc_macro]pub fnfunction_macro(input:TokenStream)->TokenStream{// 宏的处理逻辑// ...} 在上述例子中,我们使用proc_m...
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) } 使用这个自定义属性宏: #[my_attribute...
我们的foo函数已经具备了常见函数的基本形态,除了没有泛型等比较复杂的部分,这里了解分析方法就行,有需要的话再继续抽丝剥茧即可。 完整的Function的语法定义看这里:https://doc.rust-lang.org/reference/items/functions.html macro_rules!function_item_matcher { (#[$meta: meta]$vis: visasyncfn$name:ident($...
在rust_macro_test下Cargo.toml添加: [dependencies]proc_macro_crate= {path="./proc_macro_crate"} Rust过程宏 属性式过程宏 Attribute macros,用在结构体、字段、函数等地方,为其指定属性等功能。 定义 在lib.rs中加入: // 属性式过程宏 custom_proc_macro_attribute 为宏的名字#[proc_macro_attribute]pub...
function: 一个Option<&'a str>类型的字段,表示函数名。如果不可用,则为None。 这个结构体的一个主要作用是提供给panic宏的panic!(...)宏在出现panic时输出更加详细的错误信息,包括panic的文件名、行号、列号和函数名等等。 此外,Location<'a>结构体还定义了一些辅助方法来获取和打印位置信息,包括: fn file(...
3展开 #[function] 3.1 解析函数签名 首先我们要实现类型反射,也就是分别解析 SQL 函数和 Rust 函数的签名,以此决定后面如何生成代码。在过程宏入口处我们会拿到两个 TokenStream,分别包含了标注信息和函数本体: #[proc_macro_attribute] pubfnfunction(attr:TokenStream,item:TokenStream)->TokenStream{ ...
关联函数:关联函数默认情况下是不可变的(immutable),也就是说无法修改结构体的字段。在调用函数时,只能通过常量引用(&self)来传递结构体实例,因为常量引用是只读的。例如:let my_struct = MyStruct {...}; my_struct.my_function()。 使用方式的区别 ...
Rust Macro Rust Variable Scope Rust FunctionsFunctions are reusable blocks of code that perform a specific task. For example, if we want to create a program to add two numbers, then we can create a Rust function to add numbers. Now, we can reuse this same function whenever we add two ...
letsome_string = String::from("yours"); // some_string comes into scope some_string // some_string is returned and // moves out to the calling //function } // Thisfunctiontakes a String and returns it fn takes_and_gives_back(a_string: String) -> String { // a_string comes into...