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