rust 如何从重复模式中筛选出来?

t5zmwmid  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(181)

我尝试从宏生成一个结构体,如下所示:

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
有什么替代方法?

xxhby3vn

xxhby3vn1#

the reference中所述:
宏可以扩展为表达式、语句、项(包括特征、impl和外来项)、类型或模式。
值得注意的是,它们不能扩展到单个字段定义(正如@gen_struct_member调用所尝试的那样)。然而,对于您的特定问题,您可以通过一些巧妙的重复来简化为单个宏调用:

macro_rules! decl_struct {
    {
        $name:ident {
            $( const $initial:ident, )*
            $(
                mut $mut:ident,
                $( const $const:ident, )*
            )*
        }
    } => {
        struct $name {$(
            $mut: u32,
        )*}
    };
}

是的。

相关问题