Rust宏编写

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"

posted @ 2022-02-18 14:33  听风走了八千里  阅读(796)  评论(0编辑  收藏  举报