Procedural Macros
Rust提供了一个derive
的机制可以很方便地生成一些代码,在Rust 1.15以前定制derive
的功能只在nightly里才有,Rust 1.15把这一个功能稳定了,也就是说我们可以在stable的版本里面定制derive
了。
Rust book里面有一个章节Procedural Macros简单介绍了如何编写一个derive
,最后的效果如下所示:
1 | #[macro_use] |
hello_world_derive
接下来就解析一下具体的细节。
我们需要新建一个crate,这个crate里面包含自动生成代码的细节,我们将其命名为hello_world_derive
。在现阶段,必须把这些实现放在另外一个crate中,不过在将来可能就不需要这么麻烦了。
新建的crate的Cargo.toml文件如下:
1 | [package] |
proc-macro
值为true
表示这是一个Procedural Macro的crate。
lib.rs里面的代码如下:
1 | extern crate proc_macro; |
先看hello_world
函数,其输入是一个TokenStream
,现阶段我们只能调用to_string
,将它转换成字符串,然后我们调用syn
模块里面的parse函数,得到一个抽象的语法树AST(类型为MacroInput
)。
在implies_hello_world
中我们调用分析得到的AST,并利用quote
模块里的quote
宏来生成需要的代码,这样就完成了自动生成了。
这里还有一个更复杂的例子derive_new,学习它对熟悉derive
机制非常有帮助。