目前,实现自定义derive
宏根本不需要实际Trait
存在。它所做的只是在注释项后附加任意代码块,并且显然从中删除“辅助属性”。也就是说,我们可以做类似以下的事情:
#[proc_macro_derive(FakeTrait)]
pub fn custom_derive(input: TokenStream) -> TokenStream {
let name = ... // Get the ident name from input
....
quote! {
impl #name {
fn custom_function(...) {
...
}
}
}.into()
}
然后我们可以通过这个struct
宏
#[derive(FakeTrait)]
struct MyStruct {...}
并且它会很乐意地工作,通过附加impl MyStruct
到它,无论是否存在FakeTrait
。
我的问题是,这是否是宏的可接受用例derive
?它有什么缺点吗?将来可能会出现故障吗?
派生宏生成具有相同名称的特征的实现当然是最常见的情况,但这并不是强制的。因此,只要您的宏在做什么就可能“可接受”。
对于现有技术:enum_as_inner包公开了
EnumAsInner
派生宏,它不会生成任何特征实现,而是生成固有方法。