"没有规则要求令牌`<`"将类型作为标识传递给macro_rules时

时间:2018-04-30 19:58:01

标签: rust

玩具示例:

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

fn main() {
    boo!(i32);         // WORKS
    boo!(Option<i32>); // PROBLEM
}

boo!(Option<i32>);导致错误:

error: no rules expected the token `<`
 --> src/main.rs:9:16
  |
9 |     boo!(Option<i32>);
  |                ^

我可以解决这个问题:

type Opti32 = Option<i32>;
boo!(Opti32);

但为每次使用宏添加一个别名太无聊了。 是否可以使用boo!(Option<i32>);之类的宏并隐藏 macro_rules内的难度?

1 个答案:

答案 0 :(得分:4)

$T:ident只能匹配ident ifier。

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

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

identty被称为“片段说明符”,因为它们指定了元变量$T可以匹配的代码片段类型。 Rust书的第一版有a chapter on macros,包括可能的片段说明符列表;在尝试编写宏之前,你应该完全熟悉本章的内容。