码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Rust宏详解之类函数宏


    文章目录

      • 过程宏
      • 类函数宏
      • 调用与测试

    Rust基础教程:初步⚙所有权⚙结构体和枚举类⚙函数进阶⚙泛型和特征⚙并发和线程通信⚙cargo包管理
    Rust进阶教程:用宏实现参数可变的函数

    过程宏

    在Rust中,macro_rules!是最常用的宏,也叫声明式宏。

    除了这种最基础的宏之外,Rust还支持三种过程宏

    • 类函数宏(Function-like macro),看上去就像是函数调用
    • 类属性宏(Attribute-like macro),用于为目标添加自定义的属性
    • 派生宏 #[derive],可以为目标结构体或枚举派生指定的代码,例如 Debug 特征

    过程宏和声明宏有一个重要区别,即过程宏首先是一个库,需要在其配置文件中说明,下面用cargo创建一个新的项目

    cargo new --lib marco
    
    • 1

    进入文件夹后,在其配置文件结尾添加

    [lib]
    proc-macro = true
    
    • 1
    • 2

    类函数宏

    下面在lib.rs中实现一个简单的类函数宏,内容如下

    #![crate_type = "proc-macro"]
    extern crate proc_macro;
    use proc_macro::TokenStream;
    
    #[proc_macro]
    pub fn make_mod(n: TokenStream) -> TokenStream {
        let output = format!("|x|{{x}} % {}", n);
        output.parse().unwrap()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中,#[proc_macro]下面就是我们定义的类函数宏,其语法结构也像是一个函数结构,输入和输出均为TokenStream类型。

    函数内部,第一行用输入的n,拼接成一条符合Rust语法的字符串,即如下式

    |x|{x%n}
    
    • 1

    第二行,将这个表达式转换为一个可执行的语句,再行输出。

    调用与测试

    接下来,新建一个测试项目

    cargo new --bin marco_test
    
    • 1

    在其配置文件的依赖项后面添加宏包的路径

    [dependencies]
    marco = { path = "../marco" }
    
    • 1
    • 2

    最后在main.rs中调用

    extern crate marco;
    use marco::make_mod;
    
    fn main() {
        let mod3 = make_mod!(3);
        println!("{}", mod3(5));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    主函数中也包含两行,第一行是调用宏生成一个函数,结合前面的代码,可知这个函数就是

    |x|{x % 3}
    
    • 1

    这个函数的作用,就是求一个数除以 3 3 3之后的余数。

    接下来,调用 mod ⁡ 3 \operatorname{mod}3 mod3,得到 5 % 3 = 2 5\%3=2 5%3=2的输出。

  • 相关阅读:
    2023Web前端面试题及答案(二)
    C++ 迷宫问题
    分布式锁工具Redisson(Lua脚本)
    internship:编写excel表的上传方法(导入)
    顺序表详解(SeqList)
    集群启动和xshall问题
    结构优于制度,软件开发中的康威定律
    最新AI创作系统源码ChatGPT网站源码/支持Midjourney,AI绘画/支持OpenAI GPT全模型+国内AI全模型
    .NET高性能开发-位图索引(一)
    C. Yet Another Card Deck-Educational Codeforces Round 107 (Rated for Div. 2)
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/134431755
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号