Menu
Coddy logo textTech

Display トレイト

CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 36/61。

Debugはデータを検査する開発者にとって便利ですが、Displayトレイトはユーザー向けの出力を目的として設計されています。println!内の{}フォーマッタを機能させるのがこれです。Debugとは異なり、RustはDisplayを自動的に導出できません。手動で実装する必要があります。

Displayを実装するには、fmtモジュールを導入し、fmtメソッドを実装する必要があります。

use std::fmt;

struct Temperature {
    celsius: f64,
}

impl fmt::Display for Temperature {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}°C", self.celsius)
    }
}

fmt method は Formatter を受け取り、fmt::Result を返します。出力をフォーマットするには write! macro を使用し、self を通じて struct の fields にアクセスします。

これで、標準の {} formatter を使って struct を出力できます。

let temp = Temperature { celsius: 23.5 };
println!("{}", temp);  // 23.5°C

主な違いは次のとおりです。Debug出力はデータの構造を表示するため(デバッグに便利)、Display出力は整えられており、エンドユーザー向けです。struct は両方を実装できます。デバッグには{:?}を使い、すっきりした出力には{}を使います。

challenge icon

チャレンジ

簡単

ユーザーフレンドリーな商品表示システムを作成しましょう!Debugはデータの生の構造を表示しますが、Display traitを使うと、エンドユーザーに最適な、洗練された人間が読みやすい出力を作成できます。

コードを2つのファイルに分けて整理します。

  • product.rs:2つのpublicなフィールド、name(String)とprice(f64)を持つpublicなProduct structをDefineします。structにDisplay traitをImplementし、{name} - ${price}の形式でformatされるようにします。std::fmtを取り込み、fmt methodのinsideでwrite! macroをusingすることを忘れないでください。
  • main.rs:product moduleを取り込み、提供された入力をusingしてProduct instanceを作成します。標準の{} formatterをusingしてproductをPrintし、カスタムの表示出力をDisplayします。

Display traitでは、fmt methodを手動でImplementする必要があります。RustはDebugのように自動的にderiveできません。これにより、型がユーザーにどのように表示されるかを完全に制御できます。

出力では、productを見やすくユーザーフレンドリーな形式でDisplayしてください。

{name} - ${price}

たとえば、入力がWireless Mouse29.99の場合:

Wireless Mouse - $29.99

2つの入力、product nameとprice(f64としてparse)を受け取ります。

自分で試してみよう

mod product;

use product::Product;

fn main() {
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: name と price で Product のインスタンスを作成する

    // TODO: {} フォーマッタを使って product を出力する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rustオンラインコンパイラ