Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Rust辞典

  1. トップページ
  2. Rust辞典
  3. Display トレイト / Debug トレイト

Display トレイト / Debug トレイト

Rustの『Display』トレイトは『{}』フォーマット用、『Debug』トレイトは『{:?}』フォーマット用の文字列変換を定義します。Displayはエンドユーザー向け、Debugは開発者向けの出力に使われます。

構文
use std::fmt;

struct Point {
    x: f64,
    y: f64,
}

// Display トレイトの実装({} で使います)。
impl fmt::Display for Point {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

// Debug トレイトの手動実装({:?} で使います)。
impl fmt::Debug for Point {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("Point")
            .field("x", &self.x)
            .field("y", &self.y)
            .finish()
    }
}

// #[derive(Debug)] で自動実装する方が一般的です。
#[derive(Debug)]
struct Color { r: u8, g: u8, b: u8 }
フォーマット指定子一覧
フォーマット概要
{}Display トレイトを使って出力します。
{:?}Debug トレイトを使ってデバッグ出力します。
{:#?}Debug トレイトを使って整形(pretty-print)して出力します。
{:.2}小数点以下2桁で表示します(Display)。
{:5}幅5文字で右揃えします。
{:<10}幅10文字で左揃えします。
{:0>5}幅5文字で0埋めします(右揃え)。
{:b} / {:o} / {:x}2進数 / 8進数 / 16進数で表示します。
write!(f, ...)fmt::Formatter に書き込みます。
サンプルコード
use std::fmt;

#[derive(Debug)]  // Debug は derive で自動実装します。
struct Matrix {
    a: f64, b: f64,
    c: f64, d: f64,
}

// Display は手動で実装します。
impl fmt::Display for Matrix {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "[ {:.1} {:.1} ]\n[ {:.1} {:.1} ]",
            self.a, self.b, self.c, self.d)
    }
}

// エラー型にDisplayを実装します(標準的なパターン)。
#[derive(Debug)]
enum AppError {
    NotFound(String),
    PermissionDenied,
    IoError(String),
}

impl fmt::Display for AppError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            AppError::NotFound(name) => write!(f, "'{}'が見つかりません", name),
            AppError::PermissionDenied => write!(f, "権限がありません"),
            AppError::IoError(msg) => write!(f, "I/Oエラー: {}", msg),
        }
    }
}

fn main() {
    let m = Matrix { a: 1.0, b: 2.0, c: 3.0, d: 4.0 };

    // Display({})で表示します。
    println!("Display:\n{}", m);

    // Debug({:?})で表示します。
    println!("Debug: {:?}", m);

    // Debug({:#?})で整形表示します。
    println!("Pretty Debug:\n{:#?}", m);

    // フォーマット指定子の例です。
    let pi = std::f64::consts::PI;
    println!("小数点2桁: {:.2}", pi);
    println!("幅8文字: {:8.2}", pi);
    println!("左揃え: {:<8.2}", pi);
    println!("0埋め5桁: {:05}", 42);
    println!("2進数: {:b}", 42);
    println!("16進数: {:x}", 255);
    println!("大文字16進数: {:X}", 255);

    // エラー型の表示です。
    let errors = vec![
        AppError::NotFound(String::from("config.toml")),
        AppError::PermissionDenied,
        AppError::IoError(String::from("ディスクが満杯")),
    ];

    for e in &errors {
        println!("エラー: {}", e);          // Display
        println!("デバッグ: {:?}", e);     // Debug
    }
}
概要

『Display』トレイトを実装すると、自動的に『ToString』トレイトも実装されます(『to_string()』メソッドが使えるようになります)。エラー型には必ず『Display』を実装してエラーメッセージを提供するのが慣習です。

『Debug』は開発中のデバッグに使います。本番ユーザーに見せる出力には『Display』を使い、開発者向けの技術的な情報には『Debug』を使い分けてください。

トレイトの基本定義は『trait / impl Trait for 型』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。