15 个片段分类符(MacroFragSpec)简介

4 阅读1分钟

版本:

1.93.0

文字来源:

deepseek

参考资料:

Macros by example - The Rust Reference

片段分类符 - Rust 宏小册

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);