• 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"
    
    
  • 相关阅读:
    也谈一下关于兔子的问题
    关于sql函数返回表
    关于1000瓶水的问题
    WWF的疑问
    天干和地支
    在若干个整数中找到相加之和为某个整数的所有组合的算法
    输出一个数组的全排列
    新的博客, 新的里程
    学习搜索引擎心得(10.2511.25)
    下一个阶段(用C++重写Lucene的计划)
  • 原文地址:https://www.cnblogs.com/zjaiccn/p/15908536.html
Copyright © 2020-2023  润新知