2015-09-22 19 views
10

Ich habe eine Enum mit vielen WertenGet Enum als String

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

und manchmal würde Ich mag den Namen eines seines Wertes in einen Stream schreiben. Ich kann Debug ableiten und tun

, die z. I am Quux. Das ist in Ordnung, außer dass

  • Ich möchte, dies zu tun für den Benutzer gerichteten Ausgang, so Debug ist nicht angemessen
  • Es wäre sehr hilfreich sein, die Enum als String zu erhalten (und nicht direkt an ein Schreiben stream), weil ich dann seine Länge in einige wackelige Formatierungsberechnungen einbauen kann, die ich machen möchte.

Was ist der beste Weg, dies zu erreichen?

Antwort

17

Wahrscheinlich wäre der einfachste Weg, Display in Debug durch den Aufruf zu implementieren:

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

Dann können Sie to_string() eine String Darstellung zu erhalten verwenden:

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

Wenn Sie viele Aufzählungen, die Sie Möchten Sie drucken, können Sie ein triviales Makro schreiben, um die obige Implementierung von Display für jede von ihnen zu generieren.

Leider in Rust reflektierende Programmierung ist etwas schwierig. Es gibt beispielsweise keinen Standardweg, um eine Liste aller Varianten einer C-ähnlichen Enumeration zu erhalten. Fast immer muss man den Textbaustein mit selbst geschriebenen Makros abstrahieren (oder etwas auf crates.io finden). Vielleicht wird sich dies in Zukunft ändern, wenn jemand einen RFC schreiben würde und er akzeptiert würde.

+4

Wenn Sie 'std :: fmt :: {self, Debug, Display}' verwenden, ist das einfache Aufrufen von 'Debug :: fmt (self, f)' einfacher. – Veedrac

+0

Sie haben Recht, danke! –