Rust基础学习-Rust宏

Rust中的宏是生成另一段代码的一段代码。可以根据输入生成代码,简化重复模式,使得代码更加简洁。比如我们一直在用的println!,vec!,panic!都是宏。

image1_0


创建宏

可以使用macro_rules!创建一个宏:

macro_rules! macro_name {(...) => {...}
}

这里的() => {}是宏规则条目,我们可以在单个宏中匹配很多规则。

下面的宏将实现打印一个Hello World!:

macro_rules! hello_world {() => {println!("hello world!");};
}fn main() {hello_world!()
}

带参数的宏

宏也可以接受参数,这使我们能够根据不同的输入定制生成的代码。例如,这是一个定义函数以打印自定义消息的宏:

macro_rules! print_msg {($message:expr) => {println!("{}", $message)};
}fn main() {print_msg!("helllo Rust");
}

在这里,创建了一个名为 print_message 的宏,它接受一个参数 $message。宏的参数使用美元符号 $ 进行前缀,并用设计器进行类型注释。Rust 将尝试匹配在匹配规则中定义的模式。在上面的例子中,我们的规则是:

($message:expr) => {println!("{}", $message)
};

在分号后面的部分:被称为标识符,这些是我们可以选择匹配的类型。在示例中,我们使用表达式标识符(expr)。

在这个例子中 m e s s a g e message message被赋值为hello Rust,然后传递到println!({},$message);

注意:在宏规则体内,我们可以使用许多设计ators

  • stmt:一个语句
  • pat:一个模式
  • expr:一个表达式
  • ty:一个类型
  • ident:一个标识符

Rust中的重复

当我们需要生成重复的代码时,Rust 宏也非常有用。我们可以定义一个宏来接受参数,并根据这些参数重复生成的代码。

macro_rules!支持使用$(…)*语法进行重复。括号内的…可以是任何有效的Rust表达式或模式。

macro_rules! repeat_print {($($x:expr),*) => {$(println!("{}",$x);)*};
}
fn main() {repeat_print!(1, 2, 3, 4, 5, 6);
}

在这里,宏 repeat_print 接受一个参数,($($x:expr),*),这是一个重复的模式。
该模式由零个或多个表达式组成,用逗号分隔,这些表达式由宏匹配。在末尾的星号( * )符号将反复匹配 $()中的模式。

Breakdown of macro match rule in Rust

  • 在大括号内的代码 println!({}, $x); ,根据宏定义的主体中 $(…)* 的包装,会重复零次或多次,每次对参数列表中的表达式执行一次。
  • 代码中的 $x 指的是匹配的表达式。 生成的代码的每次迭代都将打印不同的表达式。
  • 现在,当我们调用 repeat_print!(1, 2, 3); 时,宏将生成这段代码:
println!("{}", 1); // matches argument 1,
println!("{}", 2); // matches argument 2,
println!("{}", 3); // matches argument 3

因此,这个宏 repeat_print! 能够以简洁和便捷的方式打印多个表达式,而无需每次都编写println!宏。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中类初始化的奥秘

一、概述 在 Java 语言中,类的加载、链接(验证、准备、解析)和初始化过程都是在程序运行期间完成的。 其中加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的。解析阶段可以在初始化之前也可以在初始化之后再开始(又叫作运行时绑定、动…

c#与汇川plc通信 使用官网API库

前言 上位机开发中有时会要求与PLC进行通信,汇川官网也有好用的API库方便大家使用。记录一下开发过程。 1.下载资料 汇川官网地址:汇川技术 - 推进工业文明 共创美好生活 打开后选择:服务与支持-》资料下载-》 资料下载 这里可以直接搜索&am…

六级作文---3.图画类

六级作文—3.图画类 范文 As is illustrated in the graph, the share of urban population increased from 19.39% to 60.6% between 1980 and 2019. From my perspective, the above figures reveal a currently prevailing tendency and represent China’s achievements i…

C++学习插曲:“name“的初始化操作由“case“标签跳过

问题 "name"的初始化操作由"case"标签跳过 问题代码 case 3: // 3、删除联系人string name;cout << "请输入删除联系人姓名&#xff1a;" << endl;cin >> name;if (isExistPerson(&abs, name) -1){cout << "…

【刷题篇】分治-归并排序

文章目录 1、排序数组2、交易逆序对的总数3、计算右侧小于当前元素的个数4、翻转对 1、排序数组 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 class Solution { public:vector<int> tmp;void mergeSort(vector<int>& nums,int left,int right){…

cocos creator3.7版本拖拽事件处理

前言&#xff1a;网上能找到的资料都太落后了&#xff0c;导致哥们用AI去写&#xff0c;全是瞎B写&#xff0c;版本都不对。贴点实际有用的。别老捣鼓你那破convertToNodeSpaceAR或者convertToNodeSpace了。 核心代码 touch.getDeltaX() touch.getDeltaY() 在cocoscreator3…

python-自幂数判断

[题目描述]&#xff1a; 自幂数是指&#xff0c;一个N 位数&#xff0c;满足各位数字N 次方之和是本身。例如&#xff0c;153153 是 33 位数&#xff0c;其每位数的 33 次方之和&#xff0c;135333153135333153&#xff0c;因此 153153 是自幂数&#xff1b;16341634 是 44 位数…

简单快速设置Windows和Ubuntu双系统双引导

一、参考资料 Windows和Ubuntu双系统安装教程 二、设置引导 1. 安装EasyBCD 下载并安装 EasyBCD 2. 设置Windows引导 3. 设置Ubuntu引导 4. 启动系统 遇到这种情况&#xff0c;直接Enter回车。 三、修复引导 如果引导区损坏&#xff0c;导致无法进入系统&#xff0c;可以…

FuTalk设计周刊-Vol.041

&#x1f525;AI漫谈 热点捕手 1、国产GPTs来了&#xff0c;基于智谱第4代大模型 全自研第四代基座大模型GLM-4&#xff0c;且所有更新迭代的能力全量上线。GLM-4性能相比GLM-3提升60%&#xff0c;逼近GPT-4&#xff08;11月6日最新版本效果&#xff09;。而同时推出的GLM-4-…

【漏洞复现】多客圈子论坛系统 httpGet 任意文件读取漏洞

0x01 产品简介 多客圈子论坛系统是一种面向特定人群或特定话题的社交网络&#xff0c;它提供了用户之间交流、分享、讨论的平台。在这个系统中&#xff0c;用户可以创建、加入不同的圈子&#xff0c;圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、…

生活中的人工智能

生活中的人工智能应用广泛&#xff0c;涵盖了多个领域&#xff0c;以下是一些主要的应用场景和详细介绍&#xff1a; 智能家居&#xff1a; 智能家居控制&#xff1a;利用AI技术&#xff0c;实现对智能家居设备的智能化控制&#xff0c;如智能灯光、智能窗帘、智能音响、智能门…

六级作文---2.选择与平衡类

六级作文—2.选择与平衡类 范文一&#xff08;选择理科还是文科专业&#xff1f;&#xff09; It is universally acknowledged that, all other factors being equal, a proper choice on major could be the difference between one’s success of failure. But when it com…

算法分析与设计期末考试复习(更新ing)

重点内容&#xff1a; 绪论&#xff1a; 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法&#xff1a; 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法&#xff08;快速幂&#xff09; 分治法解决平面最近点对问…

[个人博客]喊你来收藏下我的个人博客

最近整了两个博客 一个用来专门记录技术相关: Developer.lulu 的个人技术博客 一个用来记录平时的一些思考: 有启发 之所以决定要重新搞两个博客,是因为我个人还是喜欢一个主题,一件事情 说实话,每次在 csdn 上写碎碎念的时候,都有些不好意思,毕竟大家来这里都是抱着学技术知识…

根据反射获取枚举值集合

1、获取枚举集合&#xff08;根据枚举类名通过反射实现&#xff09; /// <summary> /// 枚举下拉列表接口 /// </summary> /// <returns></returns> [HttpGet("enumerations/{enumCode}")] [AllowAnonymous] public…

43.bug:mapper接口参数使用@param重命名导致的错误

错误信息&#xff1a;Nested exception is org.apache.ibatis.binding.bindingException:parameter inVo not found public interface UserMapper{ //查询用户列表User queryUserList(Param ("inVo") UserInVo userInVo); } 对应的UserMapper如下&#xff1a; &l…

让 AI 写高考作文丨10 款大模型 “交卷”,实力水平如何?

文章部分素材来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 前言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的未来科技&#xff0c;而是逐渐融入我们日常生活的实用工具。从智能语音助手到自动驾驶汽车&#xff0c…

kvm虚拟化2

需求&#xff0c;给你的kvm机器增加500g的neicun 1.vmware增家50g的硬盘 2.重启vm虚拟机 mkfs.xfs /dev/sdb mkdir /new_data mount -t xfs /dev/sdb /new_data #将虚拟机的磁盘放到/new_data下1先给虚拟机guanji [rootlocalhost ~]# virsh shutdown linux0224_cento7 Domai…

JS里 new Map()方法介绍

在JavaScript中&#xff0c;new Map() 用于创建一个新的Map对象。Map是一种数据结构&#xff0c;允许你存储键值对&#xff0c;其中任何值&#xff08;对象和原始值&#xff09;都可以作为一个键或一个值。 Map对象的特点&#xff1a; 键值对存储&#xff1a;Map是一种键值对…

SWD端口无法连接如何排查

大家在调试GD32 MCU的时候是否也碰到过SWD调试端口无法连接的情况&#xff1f;SWD端口无法连接的原因有很多&#xff0c;有时候排查没有思路&#xff0c;可能会耽误大家的时间&#xff0c;下面小编为大家介绍常见的SWD无法连接的原因&#xff0c;供大家排查参考&#xff1a; 排…