是否有可能有条件地启用像"derive"这样的属性?

Vic*_*voy 19 rust

我在我的箱子中添加了一个功能,增加了serde支持.但是,我不太明白如何正确使用它:

// #[derive(Debug, Serialize, Deserialize, Clone)] // goes to:

#[derive(Debug, Clone)]
#[cfg(feature = "serde_support")]
#[derive(Serialize, Deserialize)]
pub struct MyStruct;
Run Code Online (Sandbox Code Playgroud)

这段代码将下面的所有内容cfg(feature)视为有条件编译,因此如果没有我的serde_support功能,我的箱子也没有MyStruct.

我试图用大括号包装它,但它给出了另一个错误:

码:

#[derive(Debug, Clone)]
#[cfg(feature = "serde_support")] {
#[derive(Serialize, Deserialize)]
}
pub struct MyStruct;
Run Code Online (Sandbox Code Playgroud)

错误:

error: expected item after attributes
  --> mycrate/src/lib.rs:65:33
   |
65 | #[cfg(feature = "serde_support")] {
   |                                 ^
Run Code Online (Sandbox Code Playgroud)

那怎么做?

Luk*_*odt 27

您可以使用以下cfg_attr(a, b)属性:

#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
pub struct MyStruct;
Run Code Online (Sandbox Code Playgroud)

它在Rust参考文献中描述了"条件编译":

#[cfg_attr(a, b)]
item
Run Code Online (Sandbox Code Playgroud)

将是一样的#[b] item,如果a被设置cfg,和item其他.

  • 这非常有用-奇怪的是它没有在文档中更好地公开。 (3认同)
  • 但是,如果启用了“serde_support”功能,如何让文档说“MyStruct”仅实现“序列化”和“反序列化”呢? (2认同)