2015-09-22 27 views
10

ように私は多くの値取得列挙型文字列

enum Foo { 
    Bar = 0x00, 
    Baz = 0x01, 
    Qux = 0x02, 
    ... 
    Quux = 0xFF 
} 

と列挙型を持っていると時々私は、ストリームへの値のいずれかの名前を書きたいと思います。私はDebugを派生させることができ、

writer.write(format!("I am {:?}", Foo::Quux).as_bytes()) 

を出力することができます。 I am Quux。それは私がユーザー向けの出力のためにこれをやってみたいこと

  • 除き、罰金ですので、デバッグは適切ではありません
  • むしろに直接書き込むよりも、(文字列として列挙型を取得するために非常に役立つだろうストリーム)を使用すると、その長さを私がやりたいと思っている幾分かぎりの書式計算に組み込むことができるからです。

これを達成する最もよい方法は何ですか。

答えて

17

おそらく最も簡単な方法は、Debugに呼び出すことによってDisplayを実装するために、次のようになります。

impl fmt::Display for Foo { 
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
     write!(f, "{:?}", self) 
     // or, alternatively: 
     // fmt::Debug::fmt(self, f) 
    } 
} 

次にあなたがString表現を取得するためにto_string()を使用することができます:あなたはこれを使用し、多くの列挙型を持っている場合は

let s: String = Foo::Quux.to_string(); 

を印刷したい場合は、それぞれのためにDisplayの上記の実装を生成する簡単なマクロを書くことができます。

残念ながら、Rust反射プログラミングではやや難しいです。たとえば、Cのような列挙型のすべての亜種のリストを取得するための標準的な方法はありません。ほとんどの場合、カスタム定型マクロでボイラープレートを抽象化する必要があります(またはcrates.ioで何かを見つける)。おそらく、将来誰かがRFCを書いて受け入れられるようになると、これは変わるでしょう。

+4

'' std :: fmt :: {self、Debug、Display} 'を使っているなら' Debug :: fmt(self、f) 'を呼び出すだけで簡単です。 – Veedrac

+0

あなたは正しいです、ありがとう! –

関連する問題