gpt4 book ai didi

enums - 将单个枚举变体映射到 Rust 中的结果的惯用方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:08:41 24 4
gpt4 key购买 nike

我有一个枚举类型定义为

enum MyEnum {
Foo(SomeType),
Bar(SomethingElse),
Baz(YetAnotherThing),
...
}

而且我经常需要在 Result 返回函数的上下文中匹配单个案例。更具体地说,我这样写代码:

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> {
...
}

...

}

这样以后我就可以做

let x = myenum.as_foo()?

而不是更繁琐

if let MyEnum::Foo(x) = myenum {
...
} else {
return Err(MismatchError);
}

肯定有比为每个可能的变体手写方法更有效的方法来获得这种效果吗?语言中是否已经有了一些东西,或者我应该研究编写自己的宏?

我不清楚如何处理有多个字段或有命名字段的情况。前者可能通过一个元组?我总是可以通过引入中间结构来减少后者。

最佳答案

您可以使用一个简单的访问器宏来完成:

macro_rules! try_unpack {
($variant:path, $value:expr) => {
if let $variant(x) = $value {
x
} else {
return Err(MismatchError)
}
}
}

struct SomeType;
struct SomethingElse;
struct YetAnotherThing;

enum MyEnum {
Foo(SomeType),
Bar(SomethingElse),
Baz(YetAnotherThing)
}

struct MismatchError;

fn test(x: MyEnum) -> Result<i32, MismatchError> {
let y: SomethingElse = try_unpack!(MyEnum::Bar, x);
return 42;
}

关于enums - 将单个枚举变体映射到 Rust 中的结果的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com