2016-05-10 59 views
6

Rust的struct有JS的Object.keys()嗎?如何在Rust中獲取struct字段名稱?

我需要從結構字段名稱中生成CSV標頭(我使用rust-csv)。

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

如果沒有* rustc *插件(僅適用於夜間),您無法做到這一點。 – mcarton

+0

謝謝@mcarton。我將閱讀[編譯器插件](https://doc.rust-lang.org/book/compiler-plugins.html)。 我真的很喜歡將某些數據保存在一個地方,所以使用字段的名稱可能會很好。我可以搬到夜間,所以任何幫助表示讚賞。 –

+3

不太可能需要您的實際用例的編譯器插件;可以使用'[[derive(RustcDecodable)]'[在資源庫中描述](https://github.com/BurntSushi/rust-csv)。不回答你所問的問題,這是一種通用的方法來列出任何**結構體字段名稱。我的老朋友,[XY問題](http://xyproblem.info/)。 – Shepmaster

回答

7

Rust中的元編程的當前主要方法是via macros。在這種情況下,你可以捕捉所有字段名,然後添加返回他們的字符串形式的方法:

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

+1

類似的問題和解決方案:http://stackoverflow.com/a/29986760/996886 – melak47

+1

@ melak47好點!你認爲這個問題應該被標記爲重複? – Shepmaster

+0

你可以加強它..?堅持,我會增強它。 – jayphelps

相關問題