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)
无论我如何在宏中编写此模式,或者我是否使用i32或isize用于value方法参数,这似乎都会发生.更改$valueto 的片段说明符pat也是不可能的:编译器将拒绝构建枚举,即使没有负变量值也是如此.
error: expected expression, found `-1`
--> src/main.rs:5:26
|
5 | $($variant = $value,)*
| ^^^^^^
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,它在不使用宏的情况下工作,以及当我丢弃Alpha变体时.
为什么会这样?