从枚举中提取结构,而不必详尽地列出每个枚举变体

问题描述 投票:0回答:1

我想从 Rust 中的枚举中提取结构:

struct CakeInfo {
    best_by: String,
    cost: i32,
    calories: i32,
}

enum CakeCategory{
    Chocolate(CakeInfo),
    Sponge(CakeInfo),
    Fruit(CakeInfo),
}

如果枚举的所有变体都接受相同类型的结构,是否有一种简便的方法来使用 match 语句提取该值?

我想做的事:

cake = CakeCategory::Sponge(CakeInfo {
    best_by: "24-10-2024",
    cost_pence: 450,
    calories: 800,
})
cake_best_by = match cake {
    _(cake_info) => cake_info.best_by
} 

编译器希望我做什么:

cake = CakeCategory::Sponge(CakeInfo {
    best_by: "24-10-2024",
    cost_pence: 450,
    calories: 800,
})
cake_best_by = match cake {
    Chocolate(cake_info) => cake_info.best_by,
    Sponge(cake_info) => cake_info.best_by,
    Fruit(CakeInfo) => cake_info.best_by,
} 

在示例中,这并不是太麻烦,但在具有更多变体的枚举中,这很快就会变得非常重复。我知道诸如

if let
之类的模式,其中用户只对单个枚举变体感兴趣,但在这样的用例中这会更加乏味。

是否有任何语法可以完成与我尝试的等效操作?

rust enums
1个回答
0
投票

如果所有变体都具有相同的有效负载,则强烈表明您的数据结构设计不佳。 考虑一下这个设计:

struct CakeInfo {
    best_by: String,
    cost: i32,
    calories: i32,
    category: CakeCategory,
}

enum CakeCategory {
    Chocolate,
    Sponge,
    Fruit,
}

通过从所有

CakeCategory
变体中删除有效负载,我们可以简单地向
category
添加一个
CakeInfo
字段并表达完全相同的数据,但不需要
match
来获取内部信息,特别是当我们不关心时关于类别。

© www.soinside.com 2019 - 2024. All rights reserved.