当前位置: 首页 > news >正文

HoRain云--Rust 宏

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

宏的定义

实例

实例

实例

过程宏(Procedural Macros)


Rust 宏(Macros)是一种在编译时生成代码的强大工具,它允许你在编写代码时创建自定义语法扩展。

宏(Macro)是一种在代码中进行元编程(Metaprogramming)的技术,它允许在编译时生成代码,宏可以帮助简化代码,提高代码的可读性和可维护性,同时允许开发者在编译时执行一些代码生成的操作。

宏在 Rust 中有两种类型:声明式宏(Declarative Macros)和过程宏(Procedural Macros)。

本文主要介绍声明式宏。

宏的定义

在 Rust 中,使用 macro_rules! 关键字来定义声明式宏。

macro_rules! my_macro { // 模式匹配和展开 ($arg:expr) => { // 生成的代码 // 使用 $arg 来代替匹配到的表达式 }; }

声明式宏使用 macro_rules! 关键字进行定义,它们被称为"macro_rules"宏。这种宏的定义是基于模式匹配的,可以匹配代码的结构并根据匹配的模式生成相应的代码。这样的宏在不引入新的语法结构的情况下,可以用来简化一些通用的代码模式。

下面是一个简单的宏定义的例子:

实例

// 宏的定义
macro_rules! greet {
// 模式匹配
($name:expr) => {
// 宏的展开
println!("Hello, {}!", $name);
};
}

fn main() {
// 调用宏
greet!("World");
}

说明

实例

下面是一个更复杂的例子,演示了如何使用宏创建一个简单的 vec! 宏,以便更方便地创建 Vec:

实例

// 宏的定义
macro_rules! vec {
// 基本情况,空的情况
() => {
Vec::new()
};

// 递归情况,带有元素的情况
($($element:expr),+ $(,)?) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($element);
)+
temp_vec
}
};
}

fn main() {
// 调用宏
let my_vec = vec![1, 2, 3];
println!("{:?}", my_vec); // 输出: [1, 2, 3]

let empty_vec = vec![];
println!("{:?}", empty_vec); // 输出: []
}

在这个例子中,vec! 宏使用了模式匹配,以及 $($element:expr),+ $(,)?) 这样的语法来捕获传递给宏的元素,并用它们创建一个 Vec。

注意,$(,)?) 用于处理末尾的逗号,使得在不同的使用情境下都能正常工作。


过程宏(Procedural Macros)

过程宏是一种更为灵活和强大的宏,允许在编译时通过自定义代码生成过程来操作抽象语法树(AST)。过程宏在功能上更接近于函数,但是它们在编写和使用上更加复杂。

过程宏的类型:

过程宏的实现通常需要使用 proc_macro 库提供的功能,例如 TokenStream 和 TokenTree,以便更直接地操纵源代码。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

http://www.gsyq.cn/news/1510203.html

相关文章:

  • 跨境店铺评论自动处理全攻略:基于实在Agent与NLP情感分析的深度落地实操指南
  • STM32F1软PLC开发套件:FX2N指令兼容+MODBUS RTU+AD/DA采集,含Keil工程与多版原理图
  • 从倒立摆到无人机:李雅普诺夫稳定性理论在实际控制系统设计中的保姆级指南
  • 2026苏州本地不干胶标签定制哪家好?源头工厂冠威更靠谱 - 资讯快报
  • 白山黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理(更新时间:2026-06-12_11:10:26) - 诚金汇钻回收公司
  • ViT模型真的是‘大力出奇迹’吗?深入聊聊它的数据饥渴症与落地挑战
  • 长沙手表回收怎么选?2026芙蓉区好店全解析 - 逸程
  • 免费PS5手柄PC适配完全指南:如何让DualSense在Windows上完美运行
  • 2026崇左出手黄金铂金白银回收避坑指南 5 家经营多年实体回收门店走访测评 + 详细地址(更新时间:2026-06-12_11:10:26) - 中业金奢再生回收中心
  • Tecno Pova 8 5G 假镜头变点阵屏,是改进还是延续廉价设计?
  • 2026包头出手黄金铂金白银回收避坑指南 5 家经营多年实体回收门店走访测评 + 详细地址(更新时间:2026-06-12_11:10:26) - 中业金奢再生回收中心
  • 思源黑体TTF:打造跨语言设计的专业字体解决方案
  • MCP模型协同协议:AI智能体自治协作的底层通信标准
  • 别再被厂商的MTBF忽悠了!手把手教你用Excel算硬盘真实年故障率
  • ESP32开发新思路:把Arduino当“插件”装进ESP-IDF,详细配置与避坑指南
  • 2026赣州出手黄金铂金白银回收避坑指南 5 家经营多年实体回收门店走访测评 + 详细地址(更新时间:2026-06-12_11:10:26) - 中业金奢再生回收中心
  • 南宁名表回收深度实测!7大品牌资质、设备、服务全横评 - 薛定谔的梨花猫
  • 强行开启 Flash Attention 2,但没有正确设置最大序列长度
  • 2026年漯河离婚律师选对=省心 张骁隆律师值得推荐 - 本地品牌推荐
  • ASTM D4332-22包装环境测试条件应用简述
  • 5分钟搞定PotPlayer字幕翻译:免费实时翻译外挂字幕终极指南
  • 2026德州黄金回收全攻略:六家实体门店横向测评附避坑指南 - 余生黄金回收
  • 2026 哈尔滨奢侈品回收避坑指南:七家机构对比,安全变现首选添价收黄金奢侈品回收中心 - 薛定谔的梨花猫
  • 别再死记硬背公式了!用Python手把手带你复现EMA计算全过程(附代码)
  • OpenScreen多语言切换终极指南:3分钟实现界面本地化,打造个性化视频创作体验
  • 从单片机到服务器:聊聊C/C++里计时函数clock()的‘前世今生’与现代化替代方案
  • 大模型幻觉识别与防御实战指南
  • 沈阳闲置黄金怎么妥善处置?一文读懂本地黄金抵押常识 - 百航
  • TC397 CAN配置避坑指南:从Port引脚到中断,这些细节EB不会告诉你
  • 你的Google验证码为什么30秒变一次?一文拆解TOTP算法,附Python/Java代码实现