宏
Rust提供了一个强大的宏, 可进行元编程.看起来和函数很像, 只不过名称末尾有一个!
一句换概括: 用代码生成代码, 控制代码, 扩展代码
写一个最简单的宏 后边加!号的都是宏
// main.rs
#[macro_use]
mod mymacro;
// macro_test 宏
fn macro_test() {
echo_me!()
// 结果 kuqi
}
// mymacro.rs
// 定义宏
macro_rules! echo_me {
() => {
println!("kuqi")
};
}
可以传入参数的宏 ( expr ->表达式)
// mymacro.rs
// 定义宏
macro_rules! echo_me {
() => {
println!("kuqi")
};
($exp: expr) => {
println!("{:?}", $exp);
}
}
宏添加可变参数 (就是**args , kwargs ) Rust的函数中不支持 宏中支持
// mymacros.rs
// 定义宏
macro_rules! echo_me {
// () => {
// println!("kuqi")
// };
//
// ($exp: expr) => {
// println!("{:?}", $exp);
// };
// + 至少一个 // * 0到所有 有点像正则
($($exp: expr), +) => {
$(
println!("{:?}", $exp);
)+
};
}
// main.rs
echo_me!("123", "agag", "faga");
// "123"
// "123"
// "agag"
- **元编程 - 利用宏创建自定义的函数 ** (有点像python中的type 动态的创建类)
ident 指示符 常用于函数名或变量名
// mymacros.rs
macro_rules! diy_func {
($fn_name: ident) => {
fn $fn_name () {
println!("my fn name is : {:?}", stringify!($fn_name));
}
};
}
// golang 就是传入的函数名 无需定义
diy_func!(golang);
golang();
// 结果 my fn name is : "golang"