第12章: ジェネリクス - 演習

演習1: ジェネリックな関数

任意の型のスライスから最小値を返す関数を実装してください。

// TODO: ジェネリックなmin関数を実装
// ヒント: PartialOrdトレイト境界が必要

fn main() {
    let numbers = vec![5, 2, 9, 1, 7];
    let chars = vec!['z', 'a', 'm', 'b'];

    println!("最小値: {}", min(&numbers));
    println!("最小文字: {}", min(&chars));
}

演習2: ジェネリックな構造体

2つの異なる型を保持できるPair構造体を定義してください。

// TODO: Pair<T, U>構造体を定義
// first: T, second: U フィールドを持つ

// TODO: swap()メソッドを実装(firstとsecondを入れ替えたPairを返す)

fn main() {
    let pair = Pair { first: 1, second: "hello" };
    println!("元: ({}, {})", pair.first, pair.second);

    let swapped = pair.swap();
    println!("入替後: ({}, {})", swapped.first, swapped.second);
}

演習3: トレイト境界の活用

Displayトレイトを実装した型のベクタを受け取り、カンマ区切りで出力する関数を作成してください。

use std::fmt::Display;

// TODO: join_with_comma関数を実装

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    let words = vec!["apple", "banana", "cherry"];

    println!("{}", join_with_comma(&numbers)); // 1, 2, 3, 4, 5
    println!("{}", join_with_comma(&words));   // apple, banana, cherry
}

発展課題

OptionResultのような独自のジェネリックな列挙型を定義し、メソッドを実装してみてください。