私は単一の列挙型をRustのResultにマッピングする慣習的な方法は何ですか?
enum MyEnum {
Foo(SomeType),
Bar(SomethingElse),
Baz(YetAnotherThing),
...
}
として定義列挙型を持っていると私はしばしばResult
-returning機能の文脈の中で、一つのケースで一致する必要があります。具体的には、私はこのようなコードを書く:
impl MyEnum {
fn as_foo(&self) -> Result<&SomeType, Error> {
if let MyEnum::Foo(x) = y {
Ok(&x)
} else {
Err(MismatchError)
}
}
fn as_bar(&self) -> Result<&SomethingElse, Error> {
...
}
...
}
だから、後で私が代わりに面倒
if let MyEnum::Foo(x) = myenum {
...
} else {
return Err(MismatchError);
}
の
let x = myenum.as_foo()?
を行うことができます確かに取得するためのより効率的な方法がありますその可能性のあるバリアントごとにメソッドを手作業で書くよりも効果がありますか?すでに言語に何かがあるのですか?自分のマクロを研究する必要がありますか?
フィールドが複数ある場合や名前付きフィールドがある場合を処理する方法は私には分かりません。前者はおそらくタプルを通っているでしょうか?後者は中間構造体を導入することでいつも減らすことができます。
私は唯一のケースのために、自動的に私のためにこれらのアクセサを生成するための手続きマクロ( 'is_foo'、' as_foo'、 'into_foo')を書きました単一のメンバ変数のうち、同じコードを生成します。 – Shepmaster