版本:
1.93.0
文字来源:
deepseek
参考资料:
Macros by example - The Rust Reference
MacroFragSpec 另译:
捕获方式,
分类符,
宏片段说明符
在Rust的macro_rules!宏系统中,MacroFragSpec(也称为片段分类符,Fragment Specifiers)用于指定宏参数的类型。
1. item - 项
匹配可以在模块或块中作为项出现的内容。
macro_rules! demo {
($i:item) => { $i };
}
demo! {
fn test() { println!("item!"); }
}
2. block - 代码块
匹配由花括号界定的代码块。
macro_rules! demo {
($b:block) => { { println!("start"); $b } };
}
demo! {
let x = 5;
println!("x = {}", x);
}
3. stmt - 语句
匹配语句(可带也可不带分号)。
macro_rules! demo {
($s:stmt) => { $s $s }; // 重复语句
}
demo!(let x = 5;);
4. pat_param - 模式参数 (Rust 2021)
匹配模式(推荐用于Rust 2021及以后)。
macro_rules! demo {
($p:pat_param) => {
match Some(42) {
$p => "matched",
_ => "not matched"
}
};
}
demo!(Some(x)); // 正确
demo!(x); // 正确
// demo!(|x| x > 0); // 错误:这是闭包,不是模式
5. pat - 模式 (Rust 2018)
匹配模式(在Rust 2021中有限制)。
// Rust 2021中:
macro_rules! demo {
($p:pat) => { /* ... */ };
}
// 只能匹配以`|`开头的模式或其他非闭包模式
6. expr - 表达式
匹配任何Rust表达式。
macro_rules! demo {
($e:expr) => { $e * 2 };
}
let result = demo!(3 + 4); // (3 + 4) * 2
7. expr_2021 - Rust 2021表达式 ⭐
匹配符合Rust 2021语法的表达式,明确区分闭包。
// Rust 2021 Edition中
macro_rules! demo {
($e:expr_2021) => { stringify!($e) };
}
demo!(|x| x + 1); // 明确匹配为闭包表达式
demo!(a + b); // 匹配普通表达式
8. ty - 类型
匹配类型。
macro_rules! demo {
($t:ty) => { Vec<$t> };
}
let v: demo!(String) = Vec::new();
9. ident - 标识符
匹配标识符。
macro_rules! demo {
($name:ident) => {
struct $name { value: i32 }
};
}
demo!(MyStruct);
10. path - 路径
匹配限定或非限定路径。
macro_rules! demo {
($p:path) => {
fn use_path() -> $p {
<$p>::default()
}
};
}
demo!(std::string::String);
11. tt - 标记树
匹配单个标记树(最通用的分类符)。
macro_rules! demo {
($t:tt) => {
macro_rules! inner { () => { $t } };
inner!()
};
}
demo!([1, 2, 3]); // 匹配任何标记树
12. meta - 元项
匹配属性内容。
macro_rules! demo {
(#[$m:meta]) => {
#[$m]
#[allow(unused)]
struct S;
};
}
demo!(#[derive(Debug, Clone)]);
13. lifetime - 生命周期
匹配生命周期参数。
macro_rules! demo {
($l:lifetime) => {
struct RefStr<'a> {
data: &'a str,
}
type StaticRef = RefStr<$l>;
};
}
demo!('static);
14. vis - 可见性限定符
匹配可见性修饰符。
macro_rules! demo {
($v:vis $name:ident) => {
$v struct $name {
$v field: i32
}
};
}
demo!(pub MyPublicStruct);
demo!(crate MyCrateStruct);
15. literal - 字面量
匹配字面量标记。
macro_rules! demo {
($l:literal) => {
const VALUE: &str = stringify!($l);
VALUE
};
}
let s = demo!("hello");
let n = demo!(42);
let f = demo!(3.14);