使用 macro_rules! 来创建宏 - 指示符
优质
小牛编辑
128浏览
2023-12-01
宏里面的参数使用一个美元符号 $
作为前缀,并使用一个指示符(designator)来注明类型:
macro_rules! create_function {
// 此宏接受一个 `ident` 指示符参数,并创建一个名为 `$func_name`
// 的函数。
// `ident` 指示符用于变量名或函数名
($func_name:ident) => (
fn $func_name() {
// `stringify!` 宏把 `ident` 转换成字符串。
println!("You called {:?}()",
stringify!($func_name))
}
)
}
// 借助上述宏来创建名为 `foo` 和 `bar` 的函数。
create_function!(foo);
create_function!(bar);
macro_rules! print_result {
// 此宏接受一个 `expr` 类型的表达式,将它转换成一个字符串,
// 并伴随着表达式的结果。
// `expr` 指示符用于表达式。
($expression:expr) => (
// `stringify!` 把表达式转换成一个字符串,正如 stringify
// (意思为“字符串化”) 所表达的意思那样。
println!("{:?} = {:?}",
stringify!($expression),
$expression)
)
}
fn main() {
foo();
bar();
print_result!(1u32 + 1);
// 回想一下,代码块也是表达式!
print_result!({
let x = 1u32;
x * x + 2 * x - 1
});
}
这里列出全部指示符:
block
expr
用于表达式ident
用于变量名或函数名item
pat
(模式 pattern)path
stmt
(语句 statement)tt
(令牌树 token tree)ty
(类型 type)