Есть ли способ печати значений перечисления?
Есть ли простой способ форматирования и печати значений перечисления? Я ожидал, что у них будет стандартная реализация std::fmt::Display
, но это, похоже, не так.
enum Suit {
Heart,
Diamond,
Spade,
Club
}
fn main() {
let s: Suit = Suit::Heart;
println!("{}", s);
}
Требуемый вывод: Heart
Ошибка:
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`
Ответы
Ответ 1
Вы можете получить реализацию std::format::Debug
:
#[derive(Debug)]
enum Suit {
Heart,
Diamond,
Spade,
Club
}
fn main() {
let s = Suit::Heart;
println!("{:?}", s);
}
Невозможно получить Display
, потому что Display
нацелен на отображение людям, и компилятор не может автоматически решить, что является подходящим стилем для этого случая. Debug
предназначен для программистов, поэтому представление внутренней экспозиции может автоматически генерироваться.
Ответ 2
Черта Debug
выводит имя варианта Enum
.
Если вам нужно отформатировать вывод, вы можете реализовать Display
для вашего Enum
следующим образом:
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 heart = Suit::Heart;
println!("{}", heart);
}