2016-05-10 27 views
6

Pas en struct için JS en Object.keys() bazı eşdeğer var mı? Rust'ta yapısal alan adları nasıl alınır?

Ben yapı alan adları CSV başlıklarını (I rust-csv kullanın) üretmek için bir şey gerekiyor.

struct Export { 
    first_name: String, 
    last_name: String, 
    gender: String, 
    date_of_birth: String, 
    address: String 
} 

//... some code 

let mut wrtr = Writer::from_file("/home/me/export.csv").unwrap().delimiter(b'\t'); 

wrtr.encode(/* WHAT TO WRITE HERE TO GET STRUCT NAMES as tuple of strings or somethings */).is_ok() 
+0

Bir * rustc * eklentisi (bir gece sadece çalışır) olmadan bunu yapamaz. – mcarton

+0

Teşekkürler @mcarton. [Derleyici Eklentileri] hakkında bilgi alacağım (https://doc.rust-lang.org/book/compiler-plugins.html). Bazı verileri belirli bir yerde tutmayı gerçekten çok seviyorum, bu yüzden alan adını kullanmak harika olabilir. Ve her gece yardım edebilirim, böylece herhangi bir yardım takdir edildi. –

+3

Gerçek kullanım alanınız için bir derleyici eklentisine ihtiyaç yoktur; [# [türetilmiş (RustcDecodable)] 'i [depoda açıklandığı gibi] kullanabilir (https://github.com/BurntSushi/rust-csv). Sormak istediğiniz soruyu cevaplamıyor, bu liste, ** yapı alan adlarını listelemenin genel bir yoludur. Eski dostum, [XY Problem] (http://xyproblem.info/). – Shepmaster

cevap

7

Rust metaprogramlama mevcut ana yöntem via macros olup. Bu durumda, tüm alan adlarını yakalamak ve daha sonra bunların dize formlarını döndüren bir yöntem ekleyebilirsiniz: gelişmiş makrolar için

macro_rules! zoom_and_enhance { 
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => { 
     struct $name { 
      $($fname : $ftype),* 
     } 

     impl $name { 
      fn field_names() -> &'static [&'static str] { 
       static NAMES: &'static [&'static str] = &[$(stringify!($fname)),*]; 
       NAMES 
      } 
     } 
    } 
} 

zoom_and_enhance!{ 
struct Export { 
    first_name: String, 
    last_name: String, 
    gender: String, 
    date_of_birth: String, 
    address: String 
} 
} 

fn main() { 
    println!("{:?}", Export::field_names()); 
} 

, The Little Book of Rust Macros kontrol etmeyi unutmayın.

+1

Benzer soruyu yapmak sadece imkansız uzatılması için planları var henüz yeterince dokümanlar temin değil. Umarım bu yardımcı olur ama zaten kullanabilirsiniz ve çözümü:!? http://stackoverflow.com/a/29986760/996886 – melak47

+1

@ melak47 iyi bir noktaya bu soru tekrar olarak işaretlenmiş gerektiğini düşünüyor musunuz – Shepmaster

+0

bunu artırabilir .. bekle, ben geliştirmek edeceğiz o. – jayphelps