代码之家  ›  专栏  ›  技术社区  ›  E_net4 Tunn

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

  •  4
  • E_net4 Tunn  · 技术社区  · 8 年前

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

    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,
            }
        }
    }
    

    in_enum 方法下面的宏是在Serde指南的指导下编写的 enum deserialization as numbers ,其中也会匹配枚举变量值。

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

    Playground .

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

    无论我如何在宏中写下这个模式,或者是否使用 i32 isize 对于 value 方法参数。更改的片段说明符 $value pat 也不可能:编译器将拒绝构建枚举,即使没有负变量值。

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

    令人惊讶的是,它在不使用宏以及丢弃 Alpha

    为什么会发生这种情况?

    1 回复  |  直到 4 年前
        1
  •  6
  •   E_net4 Tunn    4 年前

    这是 a bug in the compiler 而且已经是 fixed in the nightly version 截至今日(2017年7月5日),以稳定版本1.20.0发布。