#[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 ? { ... }
という書式が初見。こういうこともできる、くらいで流しておこう。
前回まで
- Rustを学んでみたい(プログラミング言語)
- Rustの環境構築
- RustでHelloWorld
- Rustの和訳ドキュメント
- Cargoでプロジェクト作成・ビルド・実行
- クレートとは?
- Rustで関数を使ってみる
- Rustでモジュールを使ってみる
- Rustで乱数を生成する(rand)
- Rustで標準入力する(std::io::stdin().read_line())
- RustでMatch判定する(match)
- Rustでprintとread_lineを1行にする方法
- Rustで数当てゲーム
- クレート名にドット.が使えない
- Rustの変数と可変性(let, mut) error[E0384]: cannot assign twice to immutable variable
x
- Rustのimmutable束縛とconst定数の違い
- RustのREPL、evcxrのインストールに失敗した
- Rustでコンパイルするときの変数未使用warningを消す
- Rustの変数(再代入、再宣言(シャドーイング))
- Rustのシャドーイングについて
- イミュータブルについて(副作用)
- Rustの定数(const)
- Rustのデータ型(数値)
- Rustのデータ型(論理)
- Rustのデータ型(文字)
- Rustのデータ型(タプル)
- Rustのデータ型(配列)
- Rustの関数
- Rustのif式
- Rustのくりかえし文(loop)
- Rustのくりかえし文(while)
- Rustのくりかえし文(for)
- Rustの所有権(ムーブ)
- Rustの所有権(関数)
- Rustの所有権(スライス)
- Rustの構造体(定義とインスタンス化)
- Rustの構造体(プログラム例)
- Rustの構造体(メソッド)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustのmatch(制御フロー演算子)
- RustでNULLを扱う(Option, Some, None)
- NULL参照は10億ドルの失敗だった