web-dev-qa-db-ja.com

列挙値を出力する方法はありますか?

列挙値をフォーマットして印刷する簡単な方法はありますか?私は彼らが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`
28
Daniel Lucraft

std::format::Debugの実装を導出できます。

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

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

Displayは人間に表示することを目的としており、コンパイラはその場合に適切なスタイルを自動的に決定できないため、Displayを導出することはできません。 Debugはプログラマーを対象としているため、内部を公開するビューを自動的に生成できます。

40
DK.

Debug特性はEnumvariantの名前を出力します。

出力をフォーマットする必要がある場合は、次のようにDisplayEnumを実装できます。

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);
}
30
Matilda Smeds