2015-01-19 10 views
18

C'è un modo semplice per formattare e stampare valori enum? Mi aspettavo che avessero un'implementazione predefinita di std::fmt::Display, ma non sembra essere il caso.C'è un modo per stampare i valori enum?

enum Suit { 
    Heart, 
    Diamond, 
    Spade, 
    Club 
} 

fn main() { 
    let s: Suit = Suit::Heart; 
    println!("{}", s); 
} 

output desiderato: Heart

Errore:

error[E0277]: the trait bound `Suit: std::fmt::Display` is not satisfied 
    --> src/main.rs:10:20 
    | 
10 |  println!("{}", s); 
    |     ^the trait `std::fmt::Display` is not implemented for `Suit` 
    | 
    = note: `Suit` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string 
    = note: required by `std::fmt::Display::fmt` 
+0

Non esiste una cosa come un'implementazione di default di Rust. –

risposta

22

È possibile derivare un'implementazione del std::format::Debug:

#[derive(Debug)] 
enum Suit { 
    Heart, 
    Diamond, 
    Spade, 
    Club 
} 

fn main() { 
    let s = Suit::Heart; 
    println!("{:?}", s); 
} 

Non è possibile derivare Display perché Display si rivolge nel mostrare agli umani a e il compilatore non può decidere automaticamente quale sia uno stile appropriato per quel caso. Debug è progettato per i programmatori, pertanto è possibile generare automaticamente una vista di esposizione interna.

7

Il tratto Debug stampa il nome della variante Enum.

Se è necessario formattare l'output, è possibile implementare Display per il vostro Enum in questo modo:

use std::fmt; 

enum Suit { 
    Heart, 
    Diamond, 
    Spade, 
    Club 
} 

impl fmt::Display for Suit { 
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
     match *self { 
      Suit::Heart => write!(f, "♥"), 
      Suit::Diamond => write!(f, "♦"), 
      Suit::Spade => write!(f, "♠"), 
      Suit::Club => write!(f, "♣"), 
     } 
    } 
} 

fn main() { 
    let s = Suit::Heart; 
    println!("{}", s); 
} 
Problemi correlati