我尝试从宏生成一个结构体,如下所示:
decl_struct! {
MyStruct {
mut foo,
const bar,
}
}
问题是,我想过滤掉标记为const
的字段。我尝试过以下代码,但由于首先计算外部宏,它不起作用:
macro_rules! decl_struct {
{
$name:ident {
$( $kind:ident $member:ident, )*
}
} => {
decl_struct!(@gen_struct $name { $( decl_struct!(@gen_struct_member $kind $member) )* } );
};
// Filters the `const` members out:
(@gen_struct_member mut $member:ident) => ($member,);
(@gen_struct_member const $member:ident) => ();
// Generate the whole struct:
{
@gen_struct $name:ident {
$( $member:ident, )*
}
} => {
struct $name {
$( $member:ident : u32 /*Dummy type*/, )*
}
};
}
decl_struct! {
MyStruct {
mut foo,
const bar,
}
}
Link to the playground。
有什么替代方法?
1条答案
按热度按时间xxhby3vn1#
如the reference中所述:
宏可以扩展为表达式、语句、项(包括特征、impl和外来项)、类型或模式。
值得注意的是,它们不能扩展到单个字段定义(正如
@gen_struct_member
调用所尝试的那样)。然而,对于您的特定问题,您可以通过一些巧妙的重复来简化为单个宏调用:是的。