2017-03-02 8 views
8

Ich habe eine Funktion in meiner Kiste hinzugefügt, die serde Unterstützung hinzufügt. Allerdings verstehe ich nicht ganz, wie es richtig zu nutzen:Ist es möglich, bedingt mit Merkmalen abzuleiten?

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

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

Derzeit dieser Code behandelt alles unter cfg(feature) bedingt kompiliert, also ohne mein serde_support Feature meiner Kiste nicht MyStruct hat auch.

Ich habe versucht, es mit Klammern zu wickeln, aber es gibt einen anderen Fehler:

Code:

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

Fehler:

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

So, wie dies zu tun?

Antwort

9

Sie können das cfg_attr(a, b) Attribut:

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

Es ist in der Rust reference about "conditional compilation" beschrieben ist:

#[cfg_attr(a, b)] 
item 

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

+1

, die sehr nützlich ist - es ist seltsam, dass es nicht besser in der Dokumentation ausgesetzt ist. – ljedrz

Verwandte Themen