15-调试宏程序
9.13 调试宏程序
在开发复杂的宏时,大多数情况下,你需要分析代码如何扩展为宏提供的输入。
虽然可以在你希望看到生成代码的位置使用println!或panic!宏,但是这是一种非常粗糙的调试方法。有一些更好的解决方案可供我们选择。Rust社区为我们提供了一个名为cargo-expand的子命令。该子命令由David Tonlay开发,并且他是syn和quote软件包的作者。该命令会在内部调用夜间版编译器标志-Zunstable-options -- pretty=expanded,不过子命令的构造就是如此,它不需要你手动切换到夜间版编译器,因为它会自动完成切换。为了演示这个命令,我们将以IntoMap派生宏为例,分析它为我们生成的代码。通过切换目录,并运行cargo expand命令,我们得到以下输出结果:
如你所见,底部的impl代码块是由IntoMap派生宏产生的。cargo-expand还支持美化输出和语法高亮输出结果。此命令是编写复杂宏程序的必备工具。