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 は両方を実装できます。デバッグには{:?}を使い、すっきりした出力には{}を使います。
チャレンジ
簡単ユーザーフレンドリーな商品表示システムを作成しましょう!Debugはデータの生の構造を表示しますが、Display traitを使うと、エンドユーザーに最適な、洗練された人間が読みやすい出力を作成できます。
コードを2つのファイルに分けて整理します。
product.rs:2つのpublicなフィールド、name(String)とprice(f64)を持つpublicなProductstructをDefineします。structにDisplaytraitをImplementし、{name} - ${price}の形式でformatされるようにします。std::fmtを取り込み、fmtmethodのinsideでwrite!macroをusingすることを忘れないでください。main.rs:product moduleを取り込み、提供された入力をusingしてProductinstanceを作成します。標準の{}formatterをusingしてproductをPrintし、カスタムの表示出力をDisplayします。
Display traitでは、fmt methodを手動でImplementする必要があります。RustはDebugのように自動的にderiveできません。これにより、型がユーザーにどのように表示されるかを完全に制御できます。
出力では、productを見やすくユーザーフレンドリーな形式でDisplayしてください。
{name} - ${price}たとえば、入力がWireless Mouseと29.99の場合:
Wireless Mouse - $29.992つの入力、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 を出力する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ