第11章: トレイト - 演習

演習1: 基本的なトレイトの実装

Describableトレイトを定義し、複数の型に実装してください。

// TODO: Describableトレイトを定義
// describe(&self) -> String メソッドを持つ

struct Book {
    title: String,
    author: String,
}

struct Movie {
    title: String,
    director: String,
    year: u32,
}

// TODO: BookとMovieにDescribableを実装

fn main() {
    let book = Book {
        title: String::from("Rust本"),
        author: String::from("Alice"),
    };

    let movie = Movie {
        title: String::from("映画タイトル"),
        director: String::from("Bob"),
        year: 2024,
    };

    println!("{}", book.describe());
    println!("{}", movie.describe());
}

演習2: トレイト境界を使った関数

Printableトレイトを実装した型のみを受け入れる関数を作成してください。

trait Printable {
    fn format(&self) -> String;
}

// TODO: Printableを実装した型のベクタを受け取り、
// すべての要素をformat()して表示する関数 print_all を作成

fn main() {
    // テスト用のコード
}

演習3: 標準トレイトの活用

#[derive]を使って、DebugClonePartialEqを自動実装してください。

// TODO: 必要なderiveを追加
struct Student {
    name: String,
    grade: u32,
    gpa: f64,
}

fn main() {
    let s1 = Student {
        name: String::from("Alice"),
        grade: 3,
        gpa: 3.8,
    };

    // Debug出力
    println!("{:?}", s1);

    // Clone
    let s2 = s1.clone();

    // PartialEq比較
    println!("同じ学生: {}", s1 == s2);
}

発展課題

独自のトレイトを定義し、デフォルト実装を活用してコードの再利用性を高めてください。