为什么负整数不是宏中的有效模式?

E_n*_*ate 5 macros pattern-matching rust

让我们考虑使用静态方法的简单枚举实现,该方法检查值是否具有关联值(此处不考虑实现的效率):

enum Letter {
    Alpha = -1,
    A = 0,
    B = 1,
    C = 2,
}

impl Letter {
    pub fn in_enum(value: isize) -> bool
    {
        match value {
            -1 => true,
            0 => true,
            1 => true,
            2 => true,
            _ => false,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们编写一个用于使用等效in_enum方法构建枚举的宏.下面的宏是在Serde指南的一些指导下编写的,用于枚举反序列化作为数字,其中也会出现枚举变量值的匹配.

macro_rules! my_enum {
    ($name:ident { $($variant:ident = $value:expr, )* }) => {
        #[derive(Clone, Copy, Debug, Eq, PartialEq)]
        pub enum $name {
            $($variant = $value,)*
        }

        impl $name {
            pub fn in_enum(value: isize) -> bool
            {
                match value {
                    $( $value => true, )*
                    _ => false,
                }
            }
        }
    }
}

my_enum!(Letter {
  Alpha = -1,
  A = 0,
  B = 1,
  C = 2,
});
Run Code Online (Sandbox Code Playgroud)

游乐场.现在,编译器不会接受带有负整数的变量.

error: expected pattern, found `-1`
  --> src/main.rs:13:24
   |
13 |                     $( $value => true, )*
   |                        ^^^^^^
Run Code Online (Sandbox Code Playgroud)

无论我如何在宏中编写此模式,或者我是否使用i32isize用于value方法参数,这似乎都会发生.更改$valueto 的片段说明符pat也是不可能的:编译器将拒绝构建枚举,即使没有负变量值也是如此.

error: expected expression, found `-1`
 --> src/main.rs:5:26
  |
5 |             $($variant = $value,)*
  |                          ^^^^^^
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,它在不使用宏的情况下工作,以及当我丢弃Alpha变体时.

为什么会这样?