macro_rules! macro_name {
($元变量名:片段说明符) => {}; // 元变量名需要以$符号开头
()=>{}; // 可以定义多条规则
}
use ::std::collections::HashSet;use $crate::mod1::fn1; // 可以存放任何项条目
macro_rules! demo {
($i:item) => {
$i
};
}
fn main() {
demo!(
fn add(a: i32, b: i32) -> i32 {
a + b
}
);
println!("{}", add(1, 2));
demo!(
const A: &str = "demo";
);
println!("{}", A);
demo!(
mod mod_name {}
);
}
// 块
macro_rules! demo {
($b:block) => {
$b
};
}
fn main() {
let n = demo! {
{
if 1==1{true}else{false}
}
};
println!("{}", n);
}
// 需要一个语句
macro_rules! demo {
($s:stmt) => {
$s
};
}
fn main() {
demo!(let name = "zhangsan");
println!("{}",name);
}
// 模式pat(pattern)
macro_rules! demo {
($p:pat) => {{
let n = 1;
match n {
1 => {
println!("1")
}
_ => {
println!("other num")
}
}
}};
}
fn main() {
demo!(2);
}
// 表达式(expression)
macro_rules! demo {
($e:expr) => {$e};
}
fn main() {
demo!(2+2);
}
// ty(type)类型
macro_rules! demo {
($t:ty) => {
fn add(r: $t, l: $t) -> $t {
r + l
}
println!("{}", add(1, 2));
};
}
fn main() {
demo!(i32);
}
// 标识符(identifier)
macro_rules! demo {
($i:ident,$ii:ident) => {
fn $i() {
println!("1");
}
let $ii = 5;
};
}
fn main() {
demo!(num, five);
assert_eq!(5, five);
num();
}
// path路径
macro_rules! demo {
($p:path) => {
use $p;
};
}
fn main() {
demo!(std::collections::HashSet);
}
// token tree
macro_rules! demo {
($t:tt) => {
$t {}
};
}
fn main() {
demo!(loop);
}
// 可以用派生宏或类似宏
macro_rules! demo {
($m:meta) => {
#[derive($m)]
struct Name;
};
}
fn main() {
demo!(Clone);
}
// 为元变量提供生命周期
macro_rules! demo {
($l:lifetime) => {
let name:&$l str = "zhangsan";
};
}
fn main() {
demo!('static);
}
// 可见性(visibility)
macro_rules! demo {
($v:vis) => {
$v struct Name;
};
}
fn main() {
demo!(pub);
}
// 可以是一个数字或这是字符串
macro_rules! demo {
($l:literal) => {
$l
};
}
fn main() {
demo!(1);
demo!("zhangsna");
}
? : 出现0或1次+: 出现至少一次* : 出现0或多次macro_rules! demo {
($($metavar:frag),*) => {
$($metavar)*
}
}
// 0或1次
macro_rules! num {
(
$($l:literal)?
) => {
$($l)?
}
}
num!();
num!(0);
// 至少1次
macro_rules! num {
(
$($l:literal),+
) => {
$($l;)+
}
}
num!(1,2,3);
num!(0);
// 0或多次
macro_rules! num {
(
$($l:literal),*
) => {
$($l;)*
}
}
num!(1,2,3);
num!(0);
num!();