cargo expand是一个非常有用的工具,它主要用于宏展开。在 Rust 中,宏(macros)是一种强大的元编程工具,用于在编译时生成代码。cargo expand可以帮助开发者查看宏展开后的实际代码,这对于理解宏的工作原理、调试宏相关的问题以及学习如何编写宏都非常有帮助。
安装
bash
cargo install cargo-expand
使用
假设你有一个包含宏的 Rust 项目,在项目目录下,在命令行中输入cargo expand,它会展开项目中的宏,并将展开后的代码输出到控制台。
例如:
rust
fn main() {
let v = vec![1,2,3];
println!("{:?}", v);
}
对上述简单代码,使用了vec!
宏。 vec!宏是通过macro_rules!来定义的。macro_rules!是一种声明式宏,用于在编译时生成代码。
其核心功能是创建一个Vec类型的对象并初始化其中的元素。以vec![1, 2, 3]为例,vec!宏展开后的代码大致相当于手动创建一个Vec,然后逐个将元素添加进去。
如果我们在项目目录执行cargo expand
, 可以看到控制台生成的代码如下:
bash
#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
fn main() {
let v = <[_]>::into_vec(#[rustc_box] ::alloc::boxed::Box::new([1, 2, 3]));
{
::std::io::_print(format_args!("{0:?}\n", v));
};
}