やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustの列挙型に独自表示を実装する(E0277 対策 std::fmt::Display 実装)

 #[derive(Debug)]{:?}で楽していたところを自前で実装してみる。

成果物

参考

問題

 構造体や列挙をprintln!しようとすると以下のエラーが出ることがある。

error[E0277]: `Suit` doesn't implement `std::fmt::Display`

main.rs

fn main() {
    println!("{}", Suit::Heart);
}
enum Suit {
    Heart,
    Diamond,
    Spade,
    Club,
}

これまでの解決

  • #[derive(Debug)]
  • {:?}

main.rs

fn main() {
    println!("{:?}", Suit::Heart);
}
#[derive(Debug)]
enum Suit {
    Heart,
    Diamond,
    Spade,
    Club,
}

 コンパイルして実行する。

$ rustc main.rs
$ ./main

 以下の出力を得られる。

Heart

今回の解決

 独自の表示を実装する。

use std::fmt;
fn main() {
    println!("{}", Suit::Heart);
    println!("{}", Suit::Diamond);
    println!("{}", Suit::Spade);
    println!("{}", Suit::Club);
}
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, "♣"),
        }
    }
}

 コンパイルして実行する。

$ rustc main.rs
$ ./main

 以下の出力を得られる。

♥
♦
♠
♣

所感

 impl ? for ? { ... }という書式が初見。こういうこともできる、くらいで流しておこう。

前回まで