如何将可见性令牌传递给位标志!宏观?
How to pass a visibility token to the bitflags! macro?
我正在使用 bitflags 箱子。我想为我的类型自动生成一些其他实现,所以我尝试从另一个宏调用 bitflags!
宏。在我希望能够处理可见性令牌之前,这一直很好用。
我尝试了以下代码。
use bitflags::bitflags;
macro_rules! my_bitflags {
(
$(#[$outer:meta])*
$vis:vis struct $name:ident: $ty:ty {
$(
$(#[$inner:ident $($args:tt)*])*
const $flag:ident = $value:expr;
)+
}
) => {
bitflags! {
$(#[$outer])*
$vis struct $name: $ty {
$(
$(#[$inner $($args)*])*
const $flag = $value;
)+
}
}
// other implementations on $name here
//
}
}
my_bitflags! {
pub struct Flags: u32 {
const A = 0x1;
const B = 0x2;
const C = 0x4;
}
}
我原以为这会起作用,但我收到以下错误
error: no rules expected the token `pub `
这是 bitflags!
宏的问题吗?或者我是否错误地传递了可见性令牌?
$vis
在 bitflags!
is defined 中作为令牌树 (tt
),而不是可见性 (vis
)。可见性只是“最近”引入 rustc 并且 bitflags!
宏通过不重新定义 $vis
.
保持 backward-compatible
您需要将 my_bitflags!
中的 $vis:vis
更改为 $vis:tt
,以便它可以扩展为 bitflags!
。
我正在使用 bitflags 箱子。我想为我的类型自动生成一些其他实现,所以我尝试从另一个宏调用 bitflags!
宏。在我希望能够处理可见性令牌之前,这一直很好用。
我尝试了以下代码。
use bitflags::bitflags;
macro_rules! my_bitflags {
(
$(#[$outer:meta])*
$vis:vis struct $name:ident: $ty:ty {
$(
$(#[$inner:ident $($args:tt)*])*
const $flag:ident = $value:expr;
)+
}
) => {
bitflags! {
$(#[$outer])*
$vis struct $name: $ty {
$(
$(#[$inner $($args)*])*
const $flag = $value;
)+
}
}
// other implementations on $name here
//
}
}
my_bitflags! {
pub struct Flags: u32 {
const A = 0x1;
const B = 0x2;
const C = 0x4;
}
}
我原以为这会起作用,但我收到以下错误
error: no rules expected the token `pub `
这是 bitflags!
宏的问题吗?或者我是否错误地传递了可见性令牌?
$vis
在 bitflags!
is defined 中作为令牌树 (tt
),而不是可见性 (vis
)。可见性只是“最近”引入 rustc 并且 bitflags!
宏通过不重新定义 $vis
.
您需要将 my_bitflags!
中的 $vis:vis
更改为 $vis:tt
,以便它可以扩展为 bitflags!
。