モジュールのレッスン (1/2)
ジェネリックスと関数
ジェネリックを使用すると、柔軟で再利用可能なコードを作成でき、さまざまなデータ型に対するロジックの重複を回避できます。さまざまな型 (i32、f64、String など) に複数の関数や構造体を定義する代わりに、従来は文字 T で表されていたジェネリック型パラメーターを使用できます。
Rust コンパイラは、モノモーフィゼーション と呼ばれるプロセスを使用してジェネリックを管理します。コンパイル中に、実際に使用される具象型ごとにジェネリック コードのコピーを生成します。これは、実行時のパフォーマンスのオーバーヘッドがゼロであることを意味します。
汎用関数
ジェネリック関数を定義するには、型パラメーター <T> を関数名の直後、引数リストの前に挿入します。
fn print_value<T: std::fmt::Debug>(value: T) {
println!("Value: {:?}", value);
}ジェネリック関数では、引数の型と戻り値の型の両方にジェネリック型 T を使用できます。
fn identity<T>(value: T) -> T {
value
}汎用構造体
構造体 (struct) 内でジェネリック型パラメーターを使用して、柔軟なフィールドを定義することもできます。
struct KeyValuePair<K, V> {
key: K,
value: V,
}
fn main() {
let pair = KeyValuePair {
key: String::from("age"),
value: 30,
};
}ジェネリック構造体の impl ブロックでは、impl キーワードの直後に型パラメーター <T> を宣言して、ジェネリック構造体にメソッドを実装していることを示す必要があります。
struct Container<T> {
value: T,
}
impl<T> Container<T> {
fn new(value: T) -> Self {
Container { value }
}
fn value(&self) -> &T {
&self.value
}
}自分で試してみてください
演習 1: ポイント構造体
T 型の x と T 型の y という 2 つのフィールドを持つ Point<T> という名前の汎用構造体を定義します。 main 関数で、整数値 x = 5 および y = 10 の Point を含む変数 point をインスタンス化し、point.x の値を出力します。
ヒントを表示
`struct Point<T> { x: T, y: T }` を使用して構造体を宣言します。 main でインスタンスを作成し、`point.x` を使用して出力します。
3 回の試行後に解決策が利用可能になります
演習 2: スワップを使用してタプルを反転する
2 つの要素のタプル (T, T) を受け取り、それらの位置を逆にした新しいタプル (T, T) を返す swap<T> という名前の汎用関数を作成します。 main 関数で、タプル (1, 2) を指定して関数を呼び出し、結果を出力します。
ヒントを表示
関数のシグネチャは `fn swap<T>(pair: (T, T)) -> (T, T)`でなければなりません。`(pair.1, pair.0)` で反転したタプルを返します。
3 回の試行後に解決策が利用可能になります
演習 3: コンテナ構造体
T 型の値フィールドを含むジェネリック構造体 Container<T> を定義します。ジェネリック impl ブロックを実装して、T 型の値を受け入れ、Container<T> のインスタンスを返す新しいメソッドを定義します。
ヒントを表示
`impl<T> Container<T>`を使用して、関連付けられたメソッド`fn new(value: T) -> Self { Container { value } }` を実装します。
3 回の試行後に解決策が利用可能になります