Debug トレイト
CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 35/61。
Rustの標準ライブラリには、一般的な機能を提供する事前定義済みのトレイトが多数含まれています。開発で特に役立つものの1つがDebugトレイトで、構造体の内容を表示して確認できます。
カスタム構造体を直接出力しようとすると、Rust はその表示方法を認識できません:
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // エラー!Debug が実装されていません
{:?}フォーマッタにはDebugトレイトが必要です。手動で実装する代わりに、Rustにはショートカットとして#[derive]属性が用意されています。これをstruct定義のすぐ上に配置します。
#[derive(Debug)]
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Player { name: "Alice", score: 100 }
#[derive(Debug)]属性は、コンパイラにDebug実装を自動的に生成するよう指示します。これは、struct内のすべてのフィールドもDebugを実装している限り機能します(標準型のほとんどが実装しています)。
入れ子構造を含む出力をより読みやすくするには、整形出力に {:#?} を使用します。
println!("{:#?}", p);
// Player {
// name: "Alice",
// score: 100,
// }
開発中はDebugを導出することが重要です。カスタムのフォーマットコードを書かずに、データをすばやく調べられます。
チャレンジ
簡単Debugトレイトを導出して、構造体を調査可能にしましょう!デバッグ目的でアイテムを出力できる、シンプルな在庫システムを作成します。
コードを2つのファイルに分けて整理します。
inventory.rs:2つのpublicフィールド、name(String)とquantity(u32)を持つpublicなItem構造体をDefineします。#[derive(Debug)]属性を使用して、構造体にDebugトレイトを自動的に実装します。main.rs:inventoryモジュールを読み込み、提供された入力を使用してItemのinstanceを作成します。デバッグフォーマッタ{:?}を使用してitemを出力し、その内部構造を表示します。
Debugを導出する利点は、Rustがフォーマット用のコードを自動的に生成してくれることです。手動で実装する必要はありません!構造体には属性を付けるだけで、{:?}によって出力可能になります。
出力には、Rustのデバッグ形式でitemが表示されます。
Item { name: "{name}", quantity: {quantity} }たとえば、入力がKeyboardと15の場合:
Item { name: "Keyboard", quantity: 15 }2つの入力を受け取ります。itemの名前とquantityです(u32としてparseします)。
自分で試してみよう
mod inventory;
use inventory::Item;
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 quantity_str = String::new();
std::io::stdin().read_line(&mut quantity_str).expect("Failed to read line");
let quantity: u32 = quantity_str.trim().parse().expect("Failed to parse quantity");
// TODO: 指定された名前と数量で Item インスタンスを作成する
// TODO: デバッグフォーマッタ {:?} を使ってアイテムを出力する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ