列挙値をフォーマットして印刷する簡単な方法はありますか?私は彼らが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`
std::format::Debug
の実装を導出できます。
#[derive(Debug)]
enum Suit {
Heart,
Diamond,
Spade,
Club
}
fn main() {
let s = Suit::Heart;
println!("{:?}", s);
}
Display
は人間に表示することを目的としており、コンパイラはその場合に適切なスタイルを自動的に決定できないため、Display
を導出することはできません。 Debug
はプログラマーを対象としているため、内部を公開するビューを自動的に生成できます。
Debug
特性はEnum
variantの名前を出力します。
出力をフォーマットする必要がある場合は、次のように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);
}