2016-05-10 12 views
6

RustのstructのJSのObject.keys()に相当するものがありますか?Rustで構造体フィールド名を取得するには?

私は、構造体フィールド名から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。 [Compiler Plugins](https://doc.rust-lang.org/book/compiler-plugins.html)を読んでみましょう。 私は実際に特定のデータを1か所に保存したいので、フィールドの名前を使用するとすばらしいことがあります。そして私は夜間に移動することができたので、どんな助けにも感謝しています。 –

+3

あなたの実際の用途にコンパイラプラグインは必要ありません。リポジトリに記述されているように '#[derive(RustcDecodable)]'を使うことができます(https://github.com/BurntSushi/rust-csv)。あなたが質問している質問には答えません。これは、**任意の** structsフィールド名を一覧表示する一般的な方法です。私の古い友人、[XY問題](http://xyproblem.info/)。 – Shepmaster

答えて

7

現在、Rustでのメタプログラミングの主な方法はvia macrosです。 The Little Book of Rust 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()); 
} 

:このケースでは、すべてのフィールド名をキャプチャすることができますし、それらの文字列形式を返すメソッドを追加します。

+1

同様の質問と解決策:http://stackoverflow.com/a/29986760/996886 – melak47

+1

@ melak47良い点!この質問は重複としてマークする必要があると思いますか? – Shepmaster

+0

あなたはそれを強化することはできますか?それ。 – jayphelps

関連する問題