2017-03-02 72 views
8

我在我的箱子中添加了一個功能,它增加了serde支持。不過,我不太明白如何正確地使用它:是否可以有條件地推導出特徵?

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

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

目前這個代碼把下面cfg(feature)條件編譯的一切,所以沒有我serde_support功能我的箱子沒有MyStruct也。

我曾嘗試用大括號來包裝它,但它給出了另一個錯誤:

代碼:

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

錯誤:

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

那麼,如何做到這一點?

回答

9

可以使用cfg_attr(a, b)屬性:

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

它在Rust reference about "conditional compilation"描述:

#[cfg_attr(a, b)] 
item 

Will be the same as #[b] item if a is set by cfg , and item otherwise.

+1

這是非常有用的 - 它的怪異,它不是更好的文檔暴露。 – ljedrz

相關問題