2015-01-19 16 views
18

Có cách nào dễ dàng để định dạng và in các giá trị enum không? Tôi hy vọng rằng họ sẽ có một thực hiện mặc định của std::fmt::Display, nhưng điều đó không có vẻ như vậy.Có cách nào để in các giá trị enum không?

enum Suit { 
    Heart, 
    Diamond, 
    Spade, 
    Club 
} 

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

đầu ra mong muốn: Heart

Lỗi:

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

Không có những điều như một thực hiện mặc định trong Rust. –

Trả lời

22

Bạn có thể lấy được một thực hiện std::format::Debug:

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

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

Nó không thể lấy được DisplayDisplay là nhằm hiển thị cho con người nd trình biên dịch không thể tự động quyết định một phong cách thích hợp cho trường hợp đó là gì. Debug dành cho các lập trình viên, do đó, một chế độ xem hiển thị trong nội bộ có thể được tạo tự động.

7

Đặc điểm Debug in tên của biến thể Enum.

Nếu bạn cần phải định dạng đầu ra, bạn có thể thực hiện Display cho Enum bạn như vậy:

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); 
} 
Các vấn đề liên quan