让我们考虑一个带有静态方法的简单枚举实现,该方法检查值是否具有关联值(此处不考虑实现的效率):
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
为什么会发生这种情况?