Macros 是否可以在结构声明之后派生属性*?

Macros 是否可以在结构声明之后派生属性*?,macros,rust,Macros,Rust,我正在使用宏来扩展基本结构: pub struct MyTypedNumber(pub u32); struct_impl_my_features!(MyTypedNumber); struct\u impl\u my\u features宏可以实现MyTypedNumber的函数和特性,但是在某些情况下,使用#[derivate(PartialEq,Eq)]——例如 在声明结构之后,是否可以使用#[派生(…)] 另一种方法是将结构定义作为项参数传递给宏: struct_impl_my_fea

我正在使用宏来扩展基本结构:

pub struct MyTypedNumber(pub u32);
struct_impl_my_features!(MyTypedNumber);
struct\u impl\u my\u features
宏可以实现
MyTypedNumber
的函数和特性,但是在某些情况下,使用
#[derivate(PartialEq,Eq)]
——例如

在声明结构之后,是否可以使用
#[派生(…)]

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

struct_impl_my_features!(
    pub struct MyTypedNumber(pub u32);,
    MyTypedNumber
);
这是可行的,因此它可能是最好的选择,尽管它相当笨重,并且意味着声明和宏扩展必须结合在一起

请参阅,该宏称为
struct\u bitflag\u impl
(第二个示例)


我通过手动实现
PartialEq
Eq
解决了这个问题,但是我遇到了一个例子,Rust需要
#[派生(…)]
匹配
语句中用作常量:

=警告:编译器先前已接受此选项,但正在逐步淘汰;
这将成为未来版本中的一个硬错误!
=注:有关更多信息,
见RFC 1445
您提供的“完整示例”链接确实显示了具有宏前缀属性的示例(请参见第二个宏)

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

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));

你能提供一个完整的例子吗?MyTypedNumber与MyTypedInt有什么关系?
MyTypedInt
意外保留在中,已更正-添加了完整示例的链接。派生没有任何神奇的作用。您应该能够手动执行与它完全相同的实现。您能提供您认为需要派生的示例吗?@paholg,这也是我所期望的,在大多数情况下也是如此,但是Rust编译器不支持非派生相等,请参见:RFC 1445。在询问之后,我更新了从这个问题链接的第二个宏示例。即使如此,在定义结构后使用派生的功能还是很有用的,因为将结构定义传递到宏中有点麻烦。更新了问题。
struct_impl_my_features!(MyTypedNumber(pub u32));