Rust でデータを持つ列挙型(enum)のプロパティにアクセスする

2024/07/30に公開

はじめに

Rust のデータを持つ列挙型(enum)へのアクセスってどうやるんだ?となったので、学んだことをアウトプットします。
若干のメモ書きとなっていますが、迷っている方の救いとなれば幸いです。

▼参考
https://doc.rust-jp.rs/book-ja/ch06-01-defining-an-enum.html

列挙型の中に構造体

以下のような列挙型+構造体の組み合わせのプロパティにアクセスしたいという前提がありました。

enum Members {
    Mike(Mike),
    Bob(Bob),
    John(John),
}

struct Mike {
    name: String,
    age: u8,
}

struct Bob {
    name: String,
    age: u8,
}

struct John {
    name: String,
    age: u8,
}

このように Members の中には複数の構造体が存在している中、それぞれの name プロパティにアクセスしたいとき、パッとコードが浮かびませんでした。

結論

Members 列挙型に以下のようなget_nameを実装することで nameを取得することができます。

enum Members {
    Mike(Mike),
    Bob(Bob),
    John(John),
}

impl Members {
    fn get_name(&self) -> String {
        match self {
            Members::Mike(m) => m.name.clone(),
            Members::Bob(b) => b.name.clone(),
            Members::John(j) => j.name.clone(),
        }
    }
}

struct Mike {
    name: String,
    age: u8,
}

struct Bob {
    name: String,
    age: u8,
}

struct John {
    name: String,
    age: u8,
}

fn main() {
    let mike = Members::Mike(Mike {
        name: "Mike".to_string(),
        age: 20,
    });

    println!("Name: {}", mike.get_name());
}
コラボスタイル Developers

Discussion