🙌

Rust 基本文法 - ジェネリクス -

2024/04/07に公開

はじめに

恒例化している Rust 基本文法もボリュームアップしてきました。
本記事では、Rust のジェネリクス、ジェネリック型について説明していきます。

TypeScript 等の言語でも利用するケースがありますので、Rust に限らず押さえておきたい文法です。

Rust Playground でも試すことができますので、もし宜しければぜひ。
https://play.rust-lang.org/

ジェネリクス

プリミティブ型のジェネリクス

ジェネリクスを使うと、クラスや関数の引数や、返り値に任意の型を指定することができます。
これらの任意の型をジェネリック型と呼んでいます。

多くのケースでは以下のような指定をします。

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>のように Userstructを指定しています。
これを実行すると以下のように出力されます。

$ cargo run

名前は Alice です。年齢は 30 才です。
名前は Bob です。年齢は 25 才です。
名前は Charlie です。年齢は 20 才です。

おわりに

Rust のジェネリクスについて説明していきました。
Rust においてジェネリクスは基本なので、必ず押さえておきたいですね。

次回はジェネリクスを応用した型引数についても触れたいと思います。
気になる方はぜひ、覗いてみてくださいね!

では、Cheers!

コラボスタイル Developers

Discussion