我来教大家rust中的过程宏怎么用。
首先我们要搞清楚过程宏是什么,再学会如何使用过程宏,然后在各种小例子中实际使用我们刚刚学会的过程宏。
我们假定你熟悉rust语言,并且至少了解数据类型、迭代器、trait等内容,如果你还不熟悉这些内容,请先学习rust。
你并不需要了解宏,我们接下来会介绍。
宏是rust中非常重要的一部分,没有宏的rust就不是完整的rust。即使你初次学习rust语言,也很快就会遇到代码中的宏。
最简单来说,rust中的宏让你可以在编译时运行代码。你可以用宏在代码的任何地方干任何事情,最常见的应用是用宏代码生成其他代码。
宏可以扩展rust编译器,实现更多功能,无论是生成代码还是转换现存的代码。
rust官方文档是这样描述宏的:
The term macro refers to a family of features in Rust.
Fundamentally, macros are a way of writing code that writes other code, which is known as metaprogramming.
Metaprogramming is useful for reducing the amount of code you have to write and maintain, which is also one of the roles of functions. However, macros have some additional powers that functions don’t.
术语“宏”指的是 Rust 中的一系列功能。
从根本上讲,宏是一种编写代码来编写其他代码的方法,这称为元编程。
元编程对于减少必须编写和维护的代码量很有用,这也是函数的作用之一。但是,宏具有一些函数所没有的额外功能。
用宏你可以在编译时动态的增加需要的功能,这用函数往往是无法实现的,因为函数需要在运行时调用。一些功能,比如给一些类型实现trait需要在编译时实现。
宏的另一个优势是非常灵活,宏可以处理动态数量的参数或输入。
宏的使用和编写都有它自己的语法,我们接下来会讨论。
看看这些在项目中实际使用的宏就知道宏有多强大:
在rust中有两种宏,声明宏和过程宏。
声明宏基于语法解析。虽然官方说声明宏用来扩展语法,但是其实理解成更高级的编译时match模式匹配语句给合适。
可以定义一个或多个模式匹配,然后返回你想生成的rust代码。
我们不会在这篇文章中讨论声明宏。
使用过程宏,你基本上能实现任何编译时代码生成。唯一的限制是输入和输出需要是有效的rust代码。
实现过程宏没有什么特定的语法。
过程宏分三类:derive、attribute、functional。