跳到主要内容

宏入门

Rust提供了一个强大的宏,可进行元编程(metaprogramming)。看起来和函数很想,只不过名称末尾有一个感叹号

之前使用过的一些println!vec!format!等是。

元编程:用代码生成代码、控制代码、扩展代码

案例:

  1. Java的注解
  2. phpeval

最简单的宏

macro_rules! me {
() => {
println!("无解");
};
}

fn main() {
me!();
}

src下和main.rs同级宏

macro_rules! echo {
() => {
println!("无解");
};
}
#[macro_use]
mod mymacros;
fn main() {
echo!();
}

注意

使用mod引用之后,还得加上#[macro_use]来使用宏这个注解。


加入参数,前面写前缀,后面加上冒号,再加上表达式或者别的

macro_rules! echo {
() => {
println!("无解");
};
// 前缀: 表达式
($exp: expr) => {
println!("{}", $exp);
};
}

多个以分号隔开。

#[macro_use]
mod mymacros;
fn main() {
echo!();
echo!("abc");
let a = 3;
echo!(a == 3);
}

cargo run
无解
abc
true # 表达式的结果

改成使用stringify!包裹直接打印出表达式的内容

macro_rules! echo {
() => {
println!("无解");
};
// 前缀: 表达式
// ($exp: expr) => {
// println!("{}", $exp);
// };
($exp: expr) => {
println!("{}", stringify!($exp));
};
}