2017-03-02 32 views
8

Sandığımda serde desteği ekleyen bir özellik ekledim. Ancak, ben oldukça düzgün nasıl kullanılacağını anlamıyorum: Şartlı olarak özelliklerle türetmek mümkün mü?

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

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

Şu anda bu kod yani benim sandık ayrıca MyStruct yok benim serde_support özellik olmadan, cfg(feature) koşullu derlenmiş altında herşeyi davranır.

Ben parantez ile sarın çalıştık ama başka bir hata veriyor:

Kodu:

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

Hata:

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

Peki bu nasıl yapmalı?

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

O Rust reference about "conditional compilation" tarif ediyor:

cevap

9

Sen cfg_attr(a, b) özelliğini kullanabilirsiniz çok kullanışlı

#[cfg_attr(a, b)] 
item 

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

+1

- bu daha iyi dokümanlar maruz değil garip. – ljedrz

İlgili konular