gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:09:41 24 4
gpt4 key购买 nike

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

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 (...)] 用作 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>

最佳答案

您提供的“完整示例”链接确实显示了具有宏前缀属性的示例(参见第二个宏)。

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

关于macros - 可以在结构声明后*派生属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40401574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com