Rust 宏
时间:2026-08-20 22:18:31 353浏览 收藏
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)。过程宏在功能上更接近于函数,但是它们在编写和使用上更加复杂。
过程宏的类型:
- 派生宏(Derive Macros):用于自动实现trait(比如
Copy、Debug)的宏。 - 属性宏(Attribute Macros):用于在声明上附加额外的元数据,如
#[derive(Debug)]。
过程宏的实现通常需要使用 proc_macro 库提供的功能,例如 TokenStream 和 TokenTree,以便更直接地操纵源代码。
-
415 收藏
-
269 收藏
-
309 收藏
-
444 收藏
-
306 收藏
-
311 收藏
-
297 收藏
-
445 收藏
-
445 收藏
-
452 收藏
-
129 收藏
-
496 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习