RustでEnumを文字列(文字列slice)から生成したい

Rustを書いていると自分で定義したEnumを文字列から生成したくなる時がある。コード例で示すとこんな感じ

pub enum Foo {
  Foo1,
  Foo2,
  Foo3,
  Foo4
}

Foo::from_str("Foo1") // -> Foo::Foo1

こんな時は標準ライブラリに入っている、std::str::FromStr トレイトを実装してやるとうまいこといくし、他の似たような挙動をする型と一緒に扱えたりして便利で作法的にも良い。例は以下の通り

use std::str::FromStr;
use std::str::FromStr;

pub enum Foo {
    Foo1,
    Foo2,
    Foo3
}

impl FromStr for Foo {
    type Err = &'static str;
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "Foo1" => Ok(Foo::Foo1),
            "Foo2" => Ok(Foo::Foo2),
            "Foo3" => Ok(Foo::Foo3),
            _ => Err("Error")
        }
    }
}

Foo::from_str("Foo1") // Ok(Foo::Foo1)
Foo::from_str("Foo1sadasd") // Err("Error")

もちろんFromStrはトレイトなのでenum以外にも適用可能なので、任意の型を文字列から生成したい時にはこの方法を使いましょう。

拍手ボタン