🛡️

【Rust】Debugトレイトを使おう!

2023/09/30に公開

はじめに

Debugトレイトについて解説します。
Rust初学者向けの記事となります。

トレイトとは?

トレイト(trait)とは任意の型となりうるSelfに対して定義されたメソッドの集合のことです。同じトレイト内で宣言されたメソッド同士はお互いにアクセスすることができます。

https://doc.rust-jp.rs/rust-by-example-ja/trait.html

。。。



ざっくり言うと、とあるデータ型に対して機能を追加することです。

「trait」という英単語は、「特性」や「特質」という意味で訳されます。

オブジェクトに対して、振る舞いや特性を定義するすることにより、次のようなメリットを得られます。

  1. 再利用可能なコードにする
  2. コードの品質を保つ
  3. 可読性や拡張性が上がる等

Debugトレイトについて見ていく

以下はボーカロイドの情報を出力するコードです。

struct Vocaloid {
    name: String,
    age: u8,
    songs: Vec<String>,
}
impl Vocaloid {
    fn new(name: String, age: u8, songs: Vec<String>) -> Self {
        Self { name, age, songs }
    }
}

fn main() {
    let songs = vec![
        String::from("The Vampire"),
        String::from("Cinderella"),
        String::from("Ruma"),
    ];
    let miku = Vocaloid::new(String::from("Hatsune Miku"), 16, songs);

    println!("name: {}, age: {}, songs: {:?}", miku.name, miku.age, miku.songs);
}

実行すると、コンソールには以下のように表示されます。

name: Hatsune Miku, age: 16, songs: ["The Vampire", "Cinderella", "Ruma"]

出力部分のコードが冗長的です。引数が多いとちょっとめんどくさいです。

以下のようにコードを修正し、インスタンスの情報をそのまま出力することにします。

- println!("name: {}, age: {}, songs: {:?}", miku.name, miku.age, miku.songs);
+ println!("info: {:?}", miku);

そうすると、エラーで怒られます。

何を言われているかというと、「あなたの追加した構造体にはDebugトレイトがないから追加してね」ということ。
ということでDebugトレイトを追加します。

+ #[derive(Debug)]
struct Vocaloid {
    name: String,
    age: u8,
    songs: Vec<String>,
}
impl Vocaloid {
    fn new(name: String, age: u8, songs: Vec<String>) -> Self {
        Self { name, age, songs }
    }
}

fn main() {
    let songs = vec![
        String::from("The Vampire"),
        String::from("Cinderella"),
        String::from("Ruma"),
    ];
    let miku = Vocaloid::new(String::from("Hatsune Miku"), 16, songs);

    println!("info: {:?}", miku);
}

再び実行します。

info: Vocaloid { name: "Hatsune Miku", age: 16, songs: ["The Vampire", "Cinderella", "Ruma"] }

無事、ミクさんの情報が表示されました。

おまけ

以下の方法で、デバッグ表示を見やすくできます。

println!("info: {:#?}", miku);

出力は以下の通り。

info: Vocaloid {
    name: "Hatsune Miku",
    age: 16,
    songs: [
        "The Vampire",
        "Cinderella",
        "Ruma",
    ],
}

さいごに

Rust言語には他の言語にない概念がありますが、慣れてくると面白くなってきます。
徐々に仲良くなりたいところです。

以上、Debugトレイトについてでした。

Discussion