いくつかの列挙型を定義し、文字列からその型へのパーサーを作成したい場合、次のものよりも優れたものがあります:
impl TheType {
fn from_str(s: &str) -> TheType {
// ...
}
}
いくつかの列挙型を定義し、文字列からその型へのパーサーを作成したい場合、次のものよりも優れたものがあります:
impl TheType {
fn from_str(s: &str) -> TheType {
// ...
}
}
文字列からの変換/テキストの解析の正しい方法は、FromStr
特性を実装することです。質問の例では、次のようになります。
use std::str::FromStr;
enum Failure {
ReasonOne,
ReasonTwo,
}
impl FromStr for TheType {
type Err = Failure;
fn from_str(s: &str) -> Result<TheType, Self::Err> {
unimplemented!()
}
}
失敗できない一般的な変換の場合、次のstd::convert::From
トレイトを実装する必要があります。
use std::convert::From;
#[derive(PartialEq, Eq, Debug)]
enum MyEnum {
One,
Two,
Many(i64),
}
impl From<i64> for MyEnum {
fn from(val: i64) -> Self {
match val {
1 => MyEnum::One,
2 => MyEnum::Two,
_ => MyEnum::Many(val),
}
}
}
fn main() {
assert_eq!(MyEnum::from(1), MyEnum::One);
assert_eq!(MyEnum::from(2), MyEnum::Two);
assert_eq!(MyEnum::from(3), MyEnum::Many(3));
}
便利なことに、実装するFrom
と自動的に以下も実装されますInto
。
let one: MyEnum = 1.into(); assert_eq!(one, MyEnum::One);
let two: MyEnum = 2.into(); assert_eq!(two, MyEnum::Two);
let many: MyEnum = 3.into(); assert_eq!(many, MyEnum::Many(3));
変換が失敗する可能性があるため、std::convert::TryFrom
代わりに実装する必要があります。ただし、Rust 1.34 以降でのみ使用できますが、これらのバージョンより前では、conv
クレートで実装を使用できます。