第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
}
発展課題
OptionやResultのような独自のジェネリックな列挙型を定義し、メソッドを実装してみてください。