【发布时间】:2017-03-17 01:00:35
【问题描述】:
我正在使用宏来扩展原始结构:
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(第二个例子)。
我通过手动实现PartialEq 和Eq 来解决这个问题,但是我遇到了Rust 需要 #[derive(...)] 用作match 语句中的常量的情况:
= warning: this was previously accepted by the compiler but is being phased out;
it will become a hard error in a future release!
= note: for more information,
see RFC 1445 <https://github.com/rust-lang/rfcs/pull/1445>
【问题讨论】:
-
你能提供一个完整的例子吗? MyTypedNumber 与 MyTypedInt 有什么关系?
-
MyTypedInt不小心留下,已更正 - 添加了完整示例的链接。 -
Derive 不会做任何神奇的事情。您应该能够手动执行与它完全相同的实现。您能否提供您认为需要派生的示例?
-
@paholg,这也是我所期望的,在大多数情况下也是如此,但是 Rust 编译器不赞成对非派生相等性的支持,请参阅:RFC 1445。