学习rust语言宏之macro_rules!

news/2024/11/19 12:32:12/

    学习rust语言,必然不可避免要了解和熟悉宏。rust语言的宏功能非常强大,通过合理的编写利用宏,可以简化程序代码,也少写很多代码。今天我们先从宏的基本编写方法macro_rules开始:

1,格式

rust">macro_rules! $name {$rule0 ;$rule1 ;$rule2 ;// …$ruleN ;
}

    大括号里面的规则(rule)有点类似rust中的match匹配,匹配其中的一条rule,则用其中的内容生成具体代码。

    规则(rule)涉及到一个匹配格式:($pattern)和{$expansion}可以是任何类型的组,其中的括号和大括号根据官网说法是约定俗成。

rust">($pattern) => {$expansion}

 2,简单测试

    我们编写一个简单宏进行以下测试

rust">#[macro_export]
macro_rules! add10 {($a:expr) => {{$a+10}};
}fn testadd(){println!("the add10 value is {}", add10!(10));
}

    我们编写一个对于输入数字加10的宏,我们输入10,最终打印输出为20.

3,详解

3.1,宏捕获

    规则中可以通过多种多样的语法进行匹配捕获,匹配符合时,将运行后续语句,并将结果传输到一个变量中,最终输出。

    规则捕获中,以美元符号($)开始,后跟:符号,最后跟捕获类型。捕获类型有如下这些:

  1. item:一个项目,如函数、结构体、模块等。
  2. block:一个块(即一个语句块和/或一个表达式,用大括号括起来)
  3. stmt:一个声明
  4. pat:模式
  5. expr:表达式
  6. ty:类型
  7. ident:标识符
  8. path: 路径(例如 , , , ...)foo::std::mem::replacetransmute::<_, int>
  9. meta:一个元项;里面的东西和属性#[...]#![...]
  10. tt:单个标记树

    下面这个宏,它将输入捕获为表达式(rust本来就是表达式语言),我们写的add10宏也是将输入捕获为表达式:

rust">macro_rules! one_expression {($e:expr) => {...};
}

     例如我们也可以写一个对于任何输入数字进行与100相乘的宏mul100

rust">macro_rules! mul100 {($a:expr) => {{$a*100}};
}

    我们也可以捕获多个输入:

rust">macro_rules! moreadd {($a:expr, $b:expr, $c:expr) => {{$a+$b+$c}};
}

3.2,重复项

    模式(pattern)中可以包含重复项,而通过重复项的方法,我们可以匹配和捕获多个输入,这样通过宏极大的扩展了程序的功能。

    重复项一般通过$(.....)  sep rep的形式出现

  • $是 Literal Dollar 代币。
  • ( ... )是重复的括号分组模式。
  • sep是可选的 separator token。常见示例包括 和 。,;
  • rep是必需的重复控件。目前,这可以是 (表示零个或多个重复) 或 (表示一个或多个重复) 。您不能编写 “zero or one” 或任何其他更具体的计数或范围。*+

     

    下面我们通过官网的介绍说明的类似vec!宏的编写方法:

rust">#[macro_export]
macro_rules! my_vec {( $( $x:expr ),* ) => {{let mut temp_vec = Vec::new();$(temp_vec.push($x);)*temp_vec}};
}fn test_micro(){let v = my_vec!(1,2,3,4);for i in v{println!("the is is {}",i);}
}

 


http://www.ppmy.cn/news/1548233.html

相关文章

[C++]:C++11(一)

1. 统一列表初始化 1.1 C11 之前的初始化方式 在 C11 标准中&#xff0c;引入了一个非常实用且强大的特性——统一列表初始化&#xff08;Uniform Initialization&#xff09;&#xff0c;它为我们在初始化各种类型的对象时提供了一种统一且方便的语法形式&#xff0c;极大地…

基于 AI 智能名片 2 + 1 链动模式商城小程序的立体连接营销策略研究

摘要&#xff1a;本文围绕立体连接中线下连通社群这一环节展开&#xff0c;阐述其具体做法及意义&#xff0c;并深入探讨如何将 AI 智能名片 2 1 链动模式商城小程序融入其中&#xff0c;以优化立体连接营销策略&#xff0c;提升营销效果。 一、引言 在当今复杂多变的市场环境…

WebRTC实现双端音视频聊天(Vue3 + SpringBoot)

目录 概述 相关概念 双端连接整体实现步骤概述 文章代码实现注意点 STUN和TURN服务器的搭建 开发过程描述 后端开发流程 前端开发流程 效果演示 Gitee源码地址 概述 文章描述使用WebRTC技术实现一对一音视频通话。 由于设备摄像头限制&#xff08;一台电脑作测试无法…

商城小程序(源码+文档+部署+讲解)

本文将深入解析“商城小程序”的项目&#xff0c;探究其架构、功能以及技术栈&#xff0c;并分享获取完整源码的途径。 系统概述 商城小程序是一款专为商城小程序设计的管理平台&#xff0c;旨在通过集成各种商城管理功能来提高商城的运营效率和用户体验。该系统提供了从登录…

Leetcode打卡:最少翻转次数使二进制矩阵回文II

执行结果&#xff1a;通过 题目&#xff1a;3240 最少翻转次数使二进制矩阵回文II 给你一个 m x n 的二进制矩阵 grid 。 如果矩阵中一行或者一列从前往后与从后往前读是一样的&#xff0c;那么我们称这一行或者这一列是 回文 的。 你可以将 grid 中任意格子的值 翻转 &…

[AI] 人工智能会导致大规模失业吗?——技术发展与就业关系的深度解析

近年来,人工智能(AI)的快速发展引发了社会对其潜在影响的深刻思考,其中一个核心问题就是:人工智能是否会导致大规模失业?事实上,人工智能在提高生产效率、优化工作流程、取代部分重复性工作的同时,也在为社会带来新的职业机会。然而,关于技术和就业的关系仍然存在诸多…

python贪心算法实现(纸币找零举例)

目录 问题描述 贪心策略 Python代码实现 代码解释 示例输出 注意事项 问题描述 给定一组纸币面值和一个目标金额&#xff0c;找出用最少数量的纸币来找零的方法。 贪心策略 每次选择面值最大的纸币&#xff0c;直到无法继续选择为止。 Python代码实现 def min_bills…

网络基础Linux

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 网络传输流程图 ​编辑 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址 笔记&#xff08;画的图&#xff09; 协议&#x…