Rust &引用;令牌“”不应包含任何规则<`&引用;将类型作为标识符传递给宏规则时

Rust &引用;令牌“”不应包含任何规则<`&引用;将类型作为标识符传递给宏规则时,rust,Rust,玩具示例: macro_rules! boo { ($T:ident) => { let x: $T; }; } fn main() { boo!(i32); // WORKS boo!(Option<i32>); // PROBLEM } macro\u规则!嘘声{ ($T:ident)=>{ 设x:$T; }; } fn main(){ boo!(i32);//有效 boo!(选项);//问题 } boo

玩具示例:

macro_rules! boo {
    ($T:ident) => {
        let x: $T;
    };
}

fn main() {
    boo!(i32);         // WORKS
    boo!(Option<i32>); // PROBLEM
}
macro\u规则!嘘声{
($T:ident)=>{
设x:$T;
};
}
fn main(){
boo!(i32);//有效
boo!(选项);//问题
}
boo!(可选)导致错误:

错误:没有规则需要标记`src/main.rs:9:16
|
9 |嘘!(可选);
|                ^
我可以通过以下方式解决此问题:

type Opti32 = Option<i32>;
boo!(Opti32);
type Opti32=Option;
喝倒采(32);
但是,为每次使用宏添加别名太无聊了。 可以使用像
boo!(可选)和隐藏

宏规则中的难度

$T:ident
只能与
标识符匹配

如果希望
$T
匹配任何类型,即使它不是单个标识符,也应使用
$T:ty

macro_rules! boo {
    ($T:ty) => {
        let x: $T;
    }
}
ident
ty
被称为“片段说明符”,因为它们指定元变量
$T
可以匹配的代码片段类型。铁锈书的第一版有,包括可能的碎片说明符列表;在编写宏之前,您一定要熟悉本章的内容