The Rust Programming Language - 第19章 高级特征 - 19.5 宏

本文详细介绍了Rust编程中的宏,特别是宏的元编程能力。重点讲解了声明宏(如vec!)的工作原理和过程宏的三种形式:自定义derive、类属性宏和类函数宏。通过示例解释了如何使用macro_rules!定义宏,并探讨了宏与函数的区别,强调了宏在减少代码量和编译时处理上的优势。此外,还简要提到了过程宏的实现细节,如使用syn和quote库进行代码操作。文章最后指出,虽然宏不常用,但在某些复杂场景下是必要的工具。
摘要由CSDN通过智能技术生成

19 高级特征

我们将在这一章学习更多高级功能

19.5 宏

宏指的是Rust中一系列功能,宏用macro_rules!来声明

三种过程宏:

1.自定义#[derive]宏在结构体和枚举上指定通过derive属性添加的代码

2.类属性宏定义可用于任意项的自定义属性

3.类函数宏看起来像函数不过作用于作为参数传递的token

宏和函数的区别

从根本上来说,宏是一种为写其它代码而写代码的方式,即所谓元编程

所有宏以展开的方式来生成比我们手写出的更多的代码

元编程对于减少代码量和维护代码非常有用,它也扮演了函数的角色,但是宏有一些函数所没有的能力

1.函数声明时必须声明参数的个数和类型,但是宏不限参数数量,如:

println!("hello");
println!("hello {}",name)

2.宏可以在编译器翻译代码前展开,例如宏可以在给定的类型是实现trait。但是函数不行,因为函数是在运行时被调用,同时trait需要在编译时实现

3.实现宏更加复杂,因为它的定义复杂,你是在编写生成Rust代码的Rust代码。由于这样的间接性,宏的定义通常要比函数定义更加难阅读、理解以及维护

4.在一个文件里调用宏之前必须定义它,或将其引入作用域,而函数则可以在任何地方定义和调用

使用macro_rules!的声明宏用于通用元编程

Rust最常用的宏形式是声明宏,有时也被称为 “macros by example”、“macro_rules!宏”、或者就是“macros”。其核心概念就是声明宏允许我们编写一些类似Rust match表达式的代码

match表达式是控制结构,宏也是将一个值和包含相关代码的模式进行比较;这种情况下,该值是传递给宏的Rust源代码字面值,模式用于与其相比较,每个模式对应的代码用来替换传递给宏的代码,所有的这一切都发生在编译时

可以使用macro_rules!来定义宏。让我们查看vec!宏定义来探索macro_rules!结构

let v :Vec<u32>= vec![1,2,3];

使用vec!宏创建了一个由三个整数组成的vector,但是函数却无法做这样的事情,因为我们预先无法知道参数的数量和类型

#[macro_export]
macro_rules! vec {
    ($($x:expr),*) => {
        {
            let mut temp_vec = Vec::new();
            $(
                temp_vec.push($x);
            )*
            temp_vec
        }
    };
}

一个vec!宏定义的简化版本,在标准库中,实际定义的vec!包括预分配适量的内存的代码。这部分为代码的优化,我们这里为了简化,所以并未包括在内

无论何时导入定义了宏的包,#[macro_export]注解说明宏时可用的。如果没有这个注解,这个宏就不能被引入作用域

使用macro_rules!后接宏名称定义宏,大括号中写定义体

vec!宏的结构和match结构类似,此处有一个单边模式( ( ( (x:expr),*),后跟=>以及和模式相关的代码块。·如果模式匹配,该相关代码块将被执行。假设这是这个宏唯一的模式,则只有这一种有效的匹配,其他任何匹配都是错误的,更复杂的宏会有多个单边模式

另外宏模式所匹配的是Rust代码结构而不是而不是值

首先,一对括号包含了整个模式。接着的 后 根 一 堆 括 号 , 捕 获 了 符 合 括 号 内 模 式 的 值 以 用 于 替 换 后 的 代 码 。 后根一堆括号,捕获了符合括号内模式的值以用于替换后的代码。

《The Rust Programming Language》(Rust编程语言)是一本由Rust开发社区编写的权威指南和教程,用于学习和开发Rust编程语言Rust编程语言是一种开源、现代化的系统级编程语言,具有强大的内存安全性、并发性和性能。它最初由Mozilla开发,并于2010年首次发布。Rust的设计目标是实现安全、并发和快速的系统级编程,适用于像操作系统、浏览器引擎和嵌入式设备这样的低级应用程序。 《The Rust Programming Language》提供了对Rust编程语言的全面介绍。它从基本的语法和数据类型开始,然后涵盖了Rust的所有关键概念和特性,如所有权系统、借用检查器、模块化和并发编程等。这本书不仅适合初学者,还可以作为更有经验的开发者的参考手册。 书中详细介绍了Rust的主要特性,例如所有权系统,它可以避免常见的内存错误,如空指针和数据竞争。同时,该书还着重介绍了Rust的错误处理机制和泛型编程。读者将学习如何使用Rust编写高效、安全和易于维护的代码。 《The Rust Programming Language》还包含许多实用的示例代码和练习,帮助读者通过实践加深对Rust的理解。此外,书中还介绍了一系列构建工具和库,以及有用的开发工作流程。 总之,《The Rust Programming Language》为学习和开发Rust编程语言的人们提供了清晰、全面的指南。无论您是初学者还是有经验的开发者,都可以从中受益,提高Rust编程的技能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值