可以在*结构声明之后派生属性*吗?

时间:2016-11-03 12:31:22

标签: macros rust

我使用宏来扩展原始结构:

pub struct MyTypedNumber(pub u32);
struct_impl_my_features!(MyTypedNumber);

struct_impl_my_features宏可以实现功能& MyTypedNumber的特征,但有一种情况可以使用#[derive(PartialEq, Eq)] - 例如。

在结构已经声明之后是否可以使用#[derive(...)]

另一种方法是将结构定义作为item参数传递给宏:

struct_impl_my_features!(
    pub struct MyTypedNumber(pub u32);,
    MyTypedNumber
);

这是有效的,所以它可能是最好的选择,虽然它相当笨重,意味着声明和宏扩展必须在一起。

请参阅this complete example,宏称为struct_bitflag_impl(第二个示例)。

我通过手动实现PartialEqEq解决了这个问题,但我遇到了一个Rust 需要 #[derive(...)]作为常量{}的案例。 {1}}陈述:

match

1 个答案:

答案 0 :(得分:0)

"完整的例子"您提供的链接执行显示具有宏前缀属性的示例(请参阅第二个宏)。

    #[derive(PartialEq, Eq, Copy, Clone, Debug)]
    $struct_p_def

但是,如果您希望能够为每个结构提供派生属性(例如,只有一些结构需要派生PartialEq),您可以在第二部分的第一部分传递派生表达式struct_impl_my_features!示例 - 属性被视为item宏表单的一部分。例如,

struct_impl_my_features!(
    #[derive(PartialEq, Eq)]
    pub struct MyTypedNumber(pub u32);,
    MyTypedNumber
);

<强>更新

对不起,我对你的主要问题没有答案;据我所知,这是不可能的。但是,如果你主要担心的是笨拙,如果你的结构都是类似的形式,你可以通过将它添加到宏的顶部来使你的宏调用更好:

($x:ident ( $($v:tt)* ) ) => {
    struct_impl_my_features!(pub struct $x( $($v)* );, $x)
};

然后称之为:

struct_impl_my_features!(MyTypedNumber(pub u32));