🙌
Rust 基本文法 - ジェネリクス -
はじめに
恒例化している Rust 基本文法もボリュームアップしてきました。
本記事では、Rust のジェネリクス、ジェネリック型について説明していきます。
TypeScript 等の言語でも利用するケースがありますので、Rust に限らず押さえておきたい文法です。
Rust Playground でも試すことができますので、もし宜しければぜひ。
ジェネリクス
プリミティブ型のジェネリクス
ジェネリクスを使うと、クラスや関数の引数や、返り値に任意の型を指定することができます。
これらの任意の型をジェネリック型と呼んでいます。
多くのケースでは以下のような指定をします。
fn main() {
let name_list = vec![
"Alice".to_string(),
"Bob".to_string(),
"Charlie".to_string(),
];
fn print_name(list: Vec<String>) {
for name in list {
println!("{}", name);
}
}
print_name(name_list);
}
この例では、name_list
という配列の中に文字列が入った変数を定義し、
一番最後の行でprint_name()
の引数に渡しています。
print_name()
のなかには list: Vec<String>
という引数を受け付けられるようになっています。
この <>
のところがジェネリック型の指定箇所になります。
ここでは、String
を指定していますので、Vec
配列の String
型を受け付けるといった意味合いになります。
cargo run
を実行すると、以下のように出力されることがわかります。
$ cargo run
Alice
Bob
Charlie
構造体のジェネリクス
これを ジェネリクスをStruct
で表現することも可能です。
struct User {
name: String,
age: u32,
}
fn main() {
let user_list = vec![
User {
name: "Alice".to_string(),
age: 30,
},
User {
name: "Bob".to_string(),
age: 25,
},
User {
name: "Charlie".to_string(),
age: 20,
},
];
fn print_name(list: Vec<User>) {
for user in list {
println!("名前は {} です。年齢は {} 才です。", user.name, user.age);
}
}
print_name(user_list);
}
print_name()
の引数をVec<User>
のように User
structを指定しています。
これを実行すると以下のように出力されます。
$ cargo run
名前は Alice です。年齢は 30 才です。
名前は Bob です。年齢は 25 才です。
名前は Charlie です。年齢は 20 才です。
おわりに
Rust のジェネリクスについて説明していきました。
Rust においてジェネリクスは基本なので、必ず押さえておきたいですね。
次回はジェネリクスを応用した型引数についても触れたいと思います。
気になる方はぜひ、覗いてみてくださいね!
では、Cheers!
Discussion