指示符
宏的参数以美元符号 $ 为前缀,并用指示符来标注类型:
macro_rules! create_function {
// 这个宏接受一个 `ident` 指示符的参数,
// 并创建一个名为 `$func_name` 的函数。
// `ident` 指示符用于变量/函数名。
($func_name:ident) => {
fn $func_name() {
// `stringify!` 宏将 `ident` 转换为字符串。
println!("你调用了 {:?}()",
stringify!($func_name));
}
};
}
// 使用上面的宏创建名为 `foo` 和 `bar` 的函数。
create_function!(foo);
create_function!(bar);
macro_rules! print_result {
// 这个宏接受一个 `expr` 类型的表达式,
// 并将其作为字符串打印出来,同时打印其结果。
// `expr` 指示符用于表达式。
($expression:expr) => {
// `stringify!` 将表达式**原样**转换为字符串。
println!("{:?} = {:?}",
stringify!($expression),
$expression);
};
}
fn main() {
foo();
bar();
print_result!(1u32 + 1);
// 记住,代码块也是表达式!
print_result!({
let x = 1u32;
x * x + 2 * x - 1
});
}
以下是一些可用的指示符:
blockexpr用于表达式ident用于变量/函数名itemliteral用于字面常量pat(模式 pattern)pathstmt(语句 statement)tt(标记树 token tree)ty(类型 type)vis(可见性限定符 visibility qualifier)
完整列表请参阅 Rust 参考手册。